2011-06-30 94 views
51

如何使Async任務在一段時間間隔之後重複執行,就像Timer ...其實我正在開發一個應用程序,它將自動從服務器下載所有最新的未讀問候語,目的我必須檢查更新從服務器經過一段固定的時間間隔後....我知道這可以通過計時器輕鬆完成,但我想使用異步任務,我認爲它對android應用程序更有效。如何在固定的時間間隔內重複執行異步任務

回答

108
public void callAsynchronousTask() { 
    final Handler handler = new Handler(); 
    Timer timer = new Timer(); 
    TimerTask doAsynchronousTask = new TimerTask() {  
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() {  
        try { 
         PerformBackgroundTask performBackgroundTask = new PerformBackgroundTask(); 
         // PerformBackgroundTask this class is the class that extends AsynchTask 
         performBackgroundTask.execute(); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer.schedule(doAsynchronousTask, 0, 50000); //execute in every 50000 ms 
} 
+1

非常感謝.... – Waseem

+3

一個異步任務無論如何運行在自己的線程。爲什麼在處理程序上運行它? – Siddharth

+9

是的,異步任務在單獨的線程上運行,但不能從UI線程以外的其他線程啓動。我想這個處理程序是允許的。 – r1k0

2

你可以處理程序:

private int m_interval = 5000; // 5 seconds by default, can be changed later 
private Handle m_handler; 

@Override 
protected void onCreate(Bundle bundle) 
{ 
    ... 
    m_handler = new Handler(); 
} 

Runnable m_statusChecker = new Runnable() 
{ 
    @Override 
    public void run() { 
      updateStatus(); //this function can change value of m_interval. 
      m_handler.postDelayed(m_statusChecker, m_interval); 
    } 
} 

void startRepeatingTask() 
{ 
    m_statusChecker.run(); 
} 

void stopRepeatingTask() 
{ 
    m_handler.removeCallback(m_statusChecker); 
} 

但我會建議你檢查這個框架:http://code.google.com/intl/de-DE/android/c2dm/是一種不同的方法:當事情是準備服務器將通知電話(因此,節省了一些帶寬和性能:))

+0

感謝alot.Actually我只是發展application.Server側的客戶端已經工作了爲iPhone開發的同一個應用程序,我不得不使用的Android – Waseem

+1

在同一臺服務器我是新來穿線在android中。你在哪裏把runnable傳遞給處理程序? –

+2

回答@DheeB,回答者在這裏沒有提到它,儘管它應該在實例化過程中像這樣m_handler = new Handler(m_statusChecker);此解決方案可能無法正常工作的另一個原因,因爲問題清楚地表明將有網絡操作「自動從服務器下載所有最新的未讀問候語」..但是,儘管您正在使用處理程序,但此處理程序/ runnable仍在運行在仍然阻塞的UI線程中。您需要手動在單獨的線程中啓動它。 – tony9099

2

創建一個服務並通過報警管理器進行安排效率更高嗎?

+1

創建服務是一種痛苦,所以很多事情都需要關注服務。我寧願只使用一個計時器。 – Siddharth

+2

服務很容易啓動和停止。另外,它們並不依賴於UI線程。所以是的,我會使用服務。 –

+0

@IgorGanapolsky是的,他們是。但他們也很麻煩,爲什麼他們爲小操作創建asyntask,計時器和這些模塊,如果它們是無意義的,一切都將通過服務完成? – tony9099

6
//Every 10000 ms 
     private void doSomethingRepeatedly() { 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new TimerTask() { 
      public void run() { 

        try{ 

        new SendToServer().execute(); 

        } 
        catch (Exception e) { 
         // TODO: handle exception 
        } 

      } 
      }, 0, 10000); 
        } 
+2

建議您在Android文檔https://developer.android.com/reference/java/util/Timer.html中使用Timer上的ScheduledThreadPoolExecutor來支持所有新代碼 –

相關問題