2015-12-23 45 views
0

我想以前檢查的30秒後,檢查未讀郵件,是指當第一次檢查(AsyncTask)是完整的和我有結果,那麼我想等待30秒鐘,然後我要檢查再次閱讀未讀消息等。這裏是我的代碼:執行的AsyncTask循環後前一

TimerTask timerTask = new CheckUnreadMessages(menuItem); 
    Timer timer = new Timer(); 
    timer.schedule(timerTask, Constants.CHECK_UNREAD_COUNT_INTERVAL); 

這裏是我的TimerTask

class CheckUnreadMessages extends TimerTask{ 
    MenuItem menuItem; 

    public CheckUnreadMessages(MenuItem menuItem) { 
     this.menuItem = menuItem; 
    } 

    @Override 
    public void run() { 
     Log.i("PrivateHome", "Checking for unread message..."); 
     new CheckUnreadMessagesTask(menuItem, PrivateHome.this).execute(LocalDBSP.init().getID(PrivateHome.this)); 
    } 
} 

這裏去我AsyncTask

public class CheckUnreadMessagesTask extends AsyncTask <String, String, Boolean> { 
    Activity activity; 
    JSONObject result; 
    MenuItem menuItem; 

    public CheckUnreadMessagesTask(MenuItem menuItem, Activity activity){ 
     this.menuItem = menuItem; 
     this.activity = activity; 
    } 

    @Override 
    protected Boolean doInBackground(String... params) { 
     try { 
      //now update to server 
      result = getResponse(URLManager.getUnreadCount(params[0])); 
      return JSONHelper.isResultOK(result); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
     return false; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onPostExecute(Boolean resultOK) { 
     super.onPostExecute(resultOK); 

     if(resultOK){ 
      try { 
       String count = result.getString(JSONKeys.RESULT); 
       menuItem.setTitle(Constants.NAV_SEE_MESSAGES_TITLE+" ("+count+")"); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

但它正在爲只在第一次執行時,它不會重複。

+0

缺少相關代碼。 'CheckUnreadMessagesTask.execute()'做了什麼?這部分實際上需要在一個定時器中重新調度自己,否則沒有東西會執行這部分。此外,你應該共享一個計時器,而不是每次都創建一個新計時器。 –

+0

更新了我的問題,請告訴我該怎麼做。 –

+0

您的代碼中沒有任何內容表明您的任務應該重複。 – njzk2

回答

0

基本上你不重新安排CheckUnreadMessages,所以它只執行一次,因此它只會觸發CheckUnreadMessagesTask一次。

一個解決方案是使用timer.scheduleAtFixedRate()來代替,但是它有一個固定的速度,可能不是你想要的(但通常是這樣)。

如果你想有下一次檢查執行的最後一項任務後運行30多歲,你需要做的CheckUnreadMessagesTask重新安排,而不是:

@Override 
protected void onPostExecute(Boolean resultOK) { 
    super.onPostExecute(resultOK); 
    TimerTask timerTask = new CheckUnreadMessages(menuItem); 
    timer.schedule(timerTask, Constants.CHECK_UNREAD_COUNT_INTERVAL); 
    // ... 
} 

你需要的計時器的引用傳遞到任務,但是。我會避免每次重新創建一個新的計時器,但你可以這樣做。

此外,我發現名稱混淆,因爲兩者看起來相似,至少名稱CheckUnreadMessagesCheckUnreadMessagesTimerTask,以便哪個是哪個更明顯。

+0

會遞歸調用AsyncTask濫用內存嗎?如果是這樣,我怎樣才能避免每次都重新創建一個新的定時器? –

+1

您需要安排任務的新實例,任務不能重複使用。 –

1

不要使用AsyncTask來做到這一點,它們在活動生命週期中有很多問題。

您應該使用定期服務或使用AlarmManager。即使是30秒睡眠的Java線程也比異步任務更安全。