【问题标题】:AsyncTask Doesn't Resume When Coming Back to Activity Through ActionBar Back Icon通过 ActionBar 后退图标返回 Activity 时 AsyncTask 不恢复
【发布时间】:2012-11-04 21:48:05
【问题描述】:

我有一个AsyntTask,它以onCreate 开始并无限循环,更新一个 UI 元素。

更新是以这种方式完成的(Async扩展类的简化表示,我们称之为asyncExtender().execute()):

doInBackground(){
    while (!isCancelled()) {
        Thread.sleep(2000);
        publishProgress(someValue);
    }
}
protected void onProgressUpdate() {
    super.onProgressUpdate(values);
    // UI update here, e.g. TextView.setText
}

另一个活动开始了,我们称之为SecondActivity。 SecondActivity 利用操作栏中的分层后退按钮返回到上一个活动(onOptionsItemSelected 中的NavUtils.navigateUpFromSameTask(this))。

问题是,当我在 SecondActivity 中点击 操作栏中的返回按钮时,AsyncTask 似乎不再在第一个 Activity 中运行(UI 不会每 2 秒更新一次)。另一方面,如果我使用硬件“后退”按钮,它可以正常工作 - AsyncTask 会继续运行。

为什么会出现行为差异以及如何解决?

【问题讨论】:

    标签: android multithreading android-asynctask android-activity


    【解决方案1】:

    AsyncTasks 不应该同时启动,它们也没有设计为运行时间过长,最多几秒钟。根据您的目标 API,AsyncTasks 可能会同步运行,因此您的新 AsyncTask 将仅在之前的所有任务完成后运行,文档摘录:

    http://developer.android.com/reference/android/os/AsyncTask.html

    在首次引入时,AsyncTask 是在单个 后台线程。从 DONUT 开始,这变成了一个池 允许多个任务并行运行的线程。从...开始 HONEYCOMB,任务在单线程上执行,避免常见 并行执行导致的应用程序错误。

    【讨论】:

    • 除了使用服务之外,您还有什么建议?
    • 使用 ExecutorService 或阅读我提供的链接,可以启用 AsyncTask 以并行运行 - 这可能是更好的主意 - 只是为了检查这是否是您问题的根本原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2013-04-13
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多