我想在前一次检查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
,这样哪个更明显。