在上一个循环之后执行AsyncTask循环



我想在前一次检查30秒后检查未读消息,这意味着当第一次检查(AsyncTask)完成并得到结果时,我想等待30秒,然后我想再次检查未读信息,以此类推。这是我的代码:

    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();
            }
        }
    }
}

但这只是第一次执行,并没有重复。

不要使用AsyncTask来做这件事,他们在活动生命周期方面有很多问题。

您应该使用定期服务或使用AlarmManager。即使是睡眠时间为30秒的while为true的Java线程也比异步任务更安全。

基本上你没有重新调度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);
    // ...
}

不过,您需要将计时器的引用传递给任务。我会避免每次都重新创建一个新的计时器,但你可以这样做。

此外,我发现这个名字令人困惑,因为两者看起来很相似,至少把CheckUnreadMessages命名为CheckUnreadMessagesTimerTask,这样哪个更明显。

最新更新