Stange onPause / onResume行为

时间:2013-12-07 03:02:27

标签: android activity-lifecycle

我在我的应用中看到了onPause / onResume的一些奇怪行为,无法解决发生的事情。

我在AsyncTask中执行数据库查询(onResume的简单子类),如果它仍在执行,则在onPause中取消它。我收到了一份崩溃报告,让我想知道任务取消是否有效,因此添加了一个分析事件来记录onPostExecuteonPause取消任务后被调用。

在过去的一个月里,我看到了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,但这不重要。

2 个答案:

答案 0 :(得分:0)

只是调用cancel()不会做任何事情。你实际上必须在过程中放置​​检查以确定它是否被取消并完成取消它的工作。

操作系统在停止之前不知道你需要做些什么来清理(比如关闭文件或打开网络连接)。

答案 1 :(得分:0)

行。我已经解决了。我不确定它修复了哪个API版本,但是如果你看一下Gingerbread的代码,那么cancel()处理就会出现明显的竞争条件。用于处理来自后台的MESSAGE_POST_RESULT消息的GUI线程代码调用onPostExecute(),无论任务是否被取消。

事实证明,修复非常简单。我需要做的就是在执行isCancelled()逻辑之前添加我自己的onPostExecute()检查。

Gingerbread code收到MESSAGE_POST_RESULT并致电finish()。然后finish()拨打onPostExecute()