我想在上一次检查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();
}
}
}
}
但它只是第一次被执行,它不会重复。
答案 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
,以便更明显哪个是哪个。