我在我的应用中看到了onPause
/ onResume
的一些奇怪行为,无法解决发生的事情。
我在AsyncTask
中执行数据库查询(onResume
的简单子类),如果它仍在执行,则在onPause
中取消它。我收到了一份崩溃报告,让我想知道任务取消是否有效,因此添加了一个分析事件来记录onPostExecute
在onPause
取消任务后被调用。
在过去的一个月里,我看到了140个这样的事件,共有4,100个页面浏览量。
@Override
protected void onResume() {
super.onResume();
mIsResumed = true;
if (mReverseCardsTask == null) {
mReverseCardsTask = new TcgCursorTask(this) {
@Override
protected Cursor doInBackground(Void... params) {
return mDb.reverseFetchCards();
}
@Override
protected void onPostExecute(Cursor cursor) {
if (mIsResumed) {
onReverseCardsCursor(cursor);
} else {
EasyTracker.getTracker().sendEvent("error", "on-post-execute", "called after paused", 1L);
}
}
};
mReverseCardsTask.execute();
}
}
@Override
protected void onPause() {
super.onPause();
mIsResumed = false;
if (mReverseCardsTask != null) {
mReverseCardsTask.cancel(false);
mReverseCardsTask = null;
}
}
我有一种感觉,我错过了一些非常简单的东西,但看不到它。
我刚注意到我没有在mReverseCardsTask
中清除onPostExecute
,但这不重要。
答案 0 :(得分:0)
只是调用cancel()不会做任何事情。你实际上必须在过程中放置检查以确定它是否被取消并完成取消它的工作。
操作系统在停止之前不知道你需要做些什么来清理(比如关闭文件或打开网络连接)。
答案 1 :(得分:0)
行。我已经解决了。我不确定它修复了哪个API版本,但是如果你看一下Gingerbread的代码,那么cancel()
处理就会出现明显的竞争条件。用于处理来自后台的MESSAGE_POST_RESULT
消息的GUI线程代码调用onPostExecute()
,无论任务是否被取消。
事实证明,修复非常简单。我需要做的就是在执行isCancelled()
逻辑之前添加我自己的onPostExecute()
检查。
Gingerbread code收到MESSAGE_POST_RESULT
并致电finish()
。然后finish()
拨打onPostExecute()
。