2012-01-07 36 views

Trả lời

21

Bạn có thể muốn kiểm tra TimerTask

Vì bạn đưa lên đây một lần nữa tôi muốn làm một đề nghị khác nhau, mà là một Handler. Nó đơn giản hơn khi sử dụng TimerTask vì bạn không cần phải gọi runOnUiThread một cách rõ ràng vì Handler sẽ được liên kết với chuỗi giao diện người dùng miễn là nó được tạo trên luồng UI hoặc bạn tạo nó bằng cách sử dụng looper chính trong hàm tạo của nó. Nó sẽ làm việc như thế này:

private Handler mHandler; 
Runnable myTask = new Runnable() { 
    @Override 
    public void run() { 
    //do work 
    mHandler.postDelayed(this, 1000); 
    } 
} 

@Override 
public void onCreate(Bundle savedState) { 
    super.onCreate(savedState); 
    mHandler = new Handler(Looper.getMainLooper()); 
} 
//just as an example, we'll start the task when the activity is started 
@Override 
public void onStart() { 
    super.onStart(); 
    mHandler.postDelayed(myTask, 1000); 
} 

//at some point in your program you will probably want the handler to stop (in onStop is a good place) 
@Override 
public void onStop() { 
    super.onStop(); 
    mHandler.removeCallbacks(myTask); 
} 

Có một số điều cần biết về với xử lý trong hoạt động của bạn:

  1. hoạt động của bạn có thể tắt máy/không nhìn thấy được trong khi xử lý của bạn vẫn chạy nếu bạn don Không dừng nó trong onStop (hoặc onPause nếu bạn khởi động nó trong onResume), điều này sẽ dẫn đến các vấn đề nếu bạn cố gắng cập nhật UI
  2. Nếu điện thoại của bạn chìm sâu vào giấc ngủ, các trình xử lý sẽ không kích hoạt thường xuyên như bạn có được chỉ định. Tôi biết điều này khi tôi đã thực hiện một số thử nghiệm rộng rãi với các thiết bị bluetooth để kiểm tra kết nối sau nhiều giờ hoạt động và tôi đã sử dụng các trình xử lý cùng với các bản ghi nhật ký mỗi lần chúng bắn.
  3. Nếu bạn cần bộ hẹn giờ này được tiếp tục, tôi khuyên bạn nên đặt nó trong một dịch vụ kéo dài hơn một hoạt động. Đăng ký hoạt động của bạn với dịch vụ (bằng cách thực hiện một giao diện được định nghĩa trong dịch vụ để liên lạc với dịch vụ).
+0

Liên kết không hoạt động. – laarsk

+1

Đã sửa lỗi cho bạn. –

+0

Cảm ơn bạn vì điều đó! :) – laarsk

11

Đây là mã mà tôi đã sử dụng trong dự án hiện tại của mình. Tôi đã sử dụng TimerTask như Matt đã nói. 60000 là milisec. = 60 giây tôi đã sử dụng nó để làm mới điểm số trận đấu.

private void refreshTimer() { 
     autoUpdate = new Timer(); 
     autoUpdate.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       runOnUiThread(new Runnable() { 
        public void run() { 
         adapter = Score.getScoreListAdapter(getApplicationContext()); 
         adapter.forceReload(); 
         setListAdapter(adapter); 
        } 
       }); 
      } 
     }, 0, 60000); 
+0

Nó không hoạt động. Điều gì có nghĩa là autoUpdate? và runOnUiThread. Minus – l0gg3r

+3

Những câu hỏi này hầu như không liên quan, l0gg3r. Ông đưa ra một ví dụ về một nhiệm vụ được lên kế hoạch để chạy sau 60 giây, trên chuỗi giao diện người dùng. Bất kỳ nhà phát triển Android nào cũng dễ dàng hiểu mã. –

+0

Một điều, mặc dù, @GiantRobot. Ví dụ này hoạt động giống như setInterval hơn là setTimeout. Những thay đổi cần thiết để sử dụng mã này cho setTimeout sẽ là: thay đổi thứ tự của các giá trị (60000, 0 thay vì 0, 60000) và ngừng bộ đếm thời gian trong hàm run(), để nó chỉ chạy một lần. –

1

Có phương thức setTimeout() trong thư viện underscore-java.

Mã dụ:

import com.github.underscore.lodash.$; 
import com.github.underscore.Function; 

public class Main { 

    public static void main(String[] args) { 
     final Integer[] counter = new Integer[] {0}; 
     Function<Void> incr = new Function<Void>() { public Void apply() { 
      counter[0]++; return null; } }; 
     $.setTimeout(incr, 100); 
    } 
} 

Chức năng này sẽ được bắt đầu vào năm 100ms với một chủ đề mới.

1

Như một sự tiếp nối để Valentyn câu trả lời bằng java gạch:

Thêm phụ thuộc vào gradle:

dependencies { 
    compile group: 'com.github.javadev', name: 'underscore', version: '1.15' 
} 

Java:

import com.github.underscore.lodash.$; 

$.setTimeout(new Function<Void>() { 
    public Void apply() { 
     // work 
     return null; 
    } 
}, 1000); // 1 second 
Các vấn đề liên quan