【发布时间】:2013-12-07 03:02:27
【问题描述】:
我在我的应用中看到 onPause / onResume 出现一些奇怪的行为,无法弄清楚发生了什么。
我在onResume 中执行一个数据库查询(AsyncTask 的简单子类),如果它仍在执行,则在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;
}
}
我有一种感觉,我在这里遗漏了一些非常简单的东西,但看不到它。
我刚刚注意到我没有在onPostExecute 中清除mReverseCardsTask,但这应该没关系。
【问题讨论】:
-
你能发布堆栈跟踪吗?这会很有帮助。
-
我没有堆栈跟踪。这发生在我发布的应用程序中。我从来没有亲眼看到它发生过,我只能看到我放入代码中的分析事件来证实我的怀疑。
-
啊啊啊。我刚刚查看了 Gingerbread 的
AsyncTask代码。它有一个错误,即在处理来自后台线程的MESSAGE_POST_RESULT消息之前,它不会检查任务是否已被取消。这真的烦人。这意味着存在使cancel()语义更加复杂的竞争条件。
标签: android activity-lifecycle