在前一个

时间:2015-12-23 14:42:44

标签: android timer

我想在上一次检查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();
            }
        }
    }
}

但它只是第一次被执行,它不会重复。

2 个答案:

答案 0 :(得分:1)

不要使用AsyncTask来执行此操作,它们在活动生命周期中存在很多问题。

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

答案 1 :(得分: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);
    // ...
}

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

此外,我发现名称令人困惑,因为两者看起来相似,至少将CheckUnreadMessages命名为CheckUnreadMessagesTimerTask,以便更明显哪个是哪个。