2010-01-29 46 views
37

Tôi hiện đang cố gắng thiết lập Quét WiFi trong ứng dụng Android của mình quét các điểm truy cập WiFi cứ 30 giây một lần.Android - Kiểm soát tác vụ với Bộ hẹn giờ và Bộ hẹn giờ?

Tôi đã sử dụng Bộ hẹn giờ và Bộ hẹn giờ để quét chạy đúng theo khoảng thời gian mà tôi yêu cầu.

Tuy nhiên, tôi muốn có thể dừng và bắt đầu quét khi người dùng nhấn nút và tôi hiện đang gặp sự cố khi dừng và sau đó khởi động lại Bộ hẹn giờ và Bộ hẹn giờ.

Đây là mã của tôi

TimerTask scanTask; 
final Handler handler = new Handler(); 
Timer t = new Timer(); 

public void doWifiScan(){ 

scanTask = new TimerTask() { 
     public void run() { 
       handler.post(new Runnable() { 
         public void run() { 
         wifiManager.scan(context); 
         Log.d("TIMER", "Timer set off"); 
         } 
       }); 
     }}; 


    t.schedule(scanTask, 300, 30000); 

} 

    public void stopScan(){ 

    if(scanTask!=null){ 
     Log.d("TIMER", "timer canceled"); 
     scanTask.cancel(); 
} 

} 

Vì vậy, Timer và công tác bắt đầu tốt đẹp và quá trình quét sẽ xảy ra mỗi 30 giây tuy nhiên tôi không thể làm cho nó dừng lại, tôi có thể ngừng Timer nhưng nhiệm vụ vẫn xảy ra và scanTask. cancel() dường như không hoạt động.

Có cách nào tốt hơn để thực hiện việc này không? Hoặc tôi thiếu một cái gì đó trong các lớp Timer/TimerTask?

Trả lời

26

Bạn có thể xem xét:

  • Kiểm tra kết quả boolean từ gọi cancel() về nhiệm vụ của bạn, như nó phải cho biết nếu yêu cầu của bạn thành công hay thất bại
  • Hãy thử purge() hoặc cancel() trên Timer thay vì TimerTask

Nếu bạn không nhất thiết cần TimerTimerTask, bạn luôn có thể sử dụng postDelayed() (có sẵn trên Handler và trên bất kỳ View). Điều này sẽ lên lịch một Runnable để được thực thi trên luồng giao diện người dùng sau một sự chậm trễ. Để có nó tái diễn, chỉ cần có nó lịch trình chính nó một lần nữa sau khi làm công việc định kỳ của bạn. Sau đó, bạn có thể theo dõi cờ boolean để chỉ ra khi quá trình này kết thúc. Ví dụ:

private Runnable onEverySecond=new Runnable() { 
    public void run() { 
     // do real work here 

     if (!isPaused) { 
      someLikelyWidget.postDelayed(onEverySecond, 1000); 
     } 
    } 
}; 
+0

tôi đã cố gắng để kiểm tra boolean trên scanTask như boolean này tf = scanTask.cancel(); Nhưng bây giờ tôi nhận được một ngoại lệ con trỏ Null trên dòng đó. Tuy nhiên, nhiệm vụ đang chạy tốt? Tôi cuối cùng sẽ chạy mã trong Dịch vụ để sử dụng postDelayed là một tùy chọn? –

+0

Rõ ràng, 'scanTask' đang được đặt lại thành' null' và từ các đoạn mã bạn đã trình bày thì không thể nói lý do tại sao hay nhow. 'postDelayed()' không phải là một tùy chọn trong một 'Service', nhưng không rõ tại sao bạn muốn/cần một' Service' trong trường hợp này. – CommonsWare

+0

scanTask không được sử dụng ở bất kỳ nơi nào khác trong mã của toàn bộ ứng dụng, cũng không phải là Timer, những gì tôi đã đăng là toàn bộ việc sử dụng Timer t và TimerTask scanTask. Tôi muốn tạo ra một ứng dụng với tối thiểu không có giao diện người dùng để đọc về Android một dịch vụ là cách để làm điều này? –

5

Tài liệu Android nói rằng hủy() Hủy bỏ bộ hẹn giờ và tất cả các tác vụ đã lên lịch. Nếu có một nhiệm vụ hiện đang chạy, nó không bị ảnh hưởng. Không thể thực hiện thêm tác vụ nào trên Bộ hẹn giờ này. Các cuộc gọi tiếp theo không làm gì cả. Điều này giải thích vấn đề.

6

sử dụng mã của bạn, thay vì

scanTask.cancel(); 

cách chính xác là để hủy hẹn giờ của bạn (không TimerTask):

t.cancel(); 
Các vấn đề liên quan