2013-03-28 31 views
8

Tôi có bộ hẹn giờ trong ứng dụng của mình khởi chạy AsyncTask cứ 15 giây một lần.Android khởi chạy lại Bộ hẹn giờ sau khi chúng bị hủy

Timer timer = new Timer(); 

public void AsynchTaskTimer() { 
    final Handler handler = new Handler(); 

    TimerTask timertask = new TimerTask() { 
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
        try { 
         new updateGPSTask().execute(); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer.schedule(timertask, 0, 15000); // execute in every 15sec 
} 

Điều này được khởi chạy từ phương pháp onCreate().

Khi tôi gọi một hoạt động khác, tôi cần hủy hẹn giờ này, tôi đã sử dụng timer.cancel() theo phương pháp onPause() trong Hoạt động chính của mình.

Bây giờ khi tôi quay lại Hoạt động chính, tôi cần khởi động lại bộ hẹn giờ. Tôi đã thử khởi chạy lại AsynchTaskTimer() theo phương pháp onRestart(), nhưng tôi nhận được java.lang.IllegalStateException: Timer was canceled.

Làm cách nào để khởi động lại bộ hẹn giờ?

+0

đặt bộ hẹn giờ là không trong khi bật và tái tạo nó như timer = new Timer(); và khởi động nó như là đối tượng băm cũ đã bị hủy bỏ nó không thể được khởi động lại trừ khi bắt đầu lại một cái mới –

+0

tại sao bạn sử dụng bộ xử lý và bộ hẹn giờ với nhau? – tony9099

Trả lời

14

Hãy thử sử dụng:

public void AsynchTaskTimer() { 
    final Handler handler = new Handler(); 

    TimerTask timertask = new TimerTask() { 
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
        try { 
         new updateGPSTask().execute(); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer = new Timer(); //This is new 
    timer.schedule(timertask, 0, 15000); // execute in every 15sec 
    } 

Bằng cách sử dụng này, bạn lại có thể phân bổ bộ nhớ để hẹn giờ và bắt đầu nó AFAIK.

+0

cảm ơn bạn, điều này làm việc, kết hợp với hủy bỏ bộ đếm thời gian trong phương thức 'onPause()'! – pteixeira

+0

tuyệt vời !!! –

+0

điều duy nhất tôi couldnt được nêu ra là những gì hiện tham số thứ hai của lịch trình() phương pháp nào? timer.schedule (timertask, 0, 15000), trong ví dụ này 0 có nghĩa là – antroid

12

Vì vậy, những gì nói tài liệu về hủy() phương pháp:

Lưu ý rằng gọi phương pháp này từ bên trong method run của lặp lại timer nhiệm vụ hoàn toàn đảm bảo rằng bộ đếm thời gian nhiệm vụ sẽ không chạy nữa.

Điều đó có nghĩa là nếu bạn hủy() Hẹn giờ bạn không thể chạy lại. Bạn cần tạo phiên bản Timer mới, ví dụ như trong phương thức onResume() nếu bạn muốn chạy lại nó.

@Override 
public void onResume() { 
    super.onResume(); 
    // intialise new instance of Timer 
} 
1

Thay vì sử dụng TimerTask, bạn có thể chuyển mã của bạn (được sử dụng để cập nhật GPS) để một service. Tôi nghĩ nó tốt hơn. Bạn có thể gọi startService() trong onCreate()stopService() trong onDestroy(). Lưu ý rằng các dịch vụ chạy trên luồng giao diện người dùng chính, vì vậy hãy đảm bảo tránh NetworkOnMainThreadException trong tác vụ cập nhật GPS của bạn.

+0

đây là cách tiếp cận ban đầu của tôi, nhưng vì lý do nào đó Dịch vụ của tôi không bắt đầu .. Vì đây chỉ là một bằng chứng về khái niệm nó không 't thực sự quan trọng, nhưng nó là trên danh sách TODO của tôi nếu nó bao giờ phát triển thành một điều thực sự! – pteixeira

Các vấn đề liên quan