【问题标题】:Android AsyncTask remains in running state after completingAndroid AsyncTask 完成后保持运行状态
【发布时间】:2010-08-17 09:58:20
【问题描述】:

在开发应用程序时,我注意到线程数一直在增长。 AsyncTask 线程由于某种原因保持打开状态(我确定它们已完成处理并退出)。我不知道为什么我不断创建更多这种类型的线程并且它们会无限期地运行。

有什么方法可以验证这些线程是否在完成时终止? AsyncTask 线程保持打开状态是否存在任何已知问题?

运行时:

public  class DoNothingTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            return null;
        }

    }

每次我在调试器中看到一个新线程new DoNothingTask().execute(null); 如下:

Thread[&lt;ThreadNumber&gt;AsyncTask#1](running)

我的问题是为什么会这样?我的应用程序非常依赖 AsyncTask,我无法在每个任务之后创建新线程并保持活动状态。

【问题讨论】:

    标签: android multithreading


    【解决方案1】:

    我也对此一头雾水,只是偶然发现了这个答案(嗯,这更像是一个解释而不是一个答案):

    CommonsWare 解释:

    AsyncTask 管理一个使用 ThreadPoolExecutor 创建的线程池。它将有 5 到 128 个线程。如果线程数超过 5 个,则这些多余的线程最多会停留 10 秒,然后才会被移除。 (注意:这些数字是针对目前可见的开源代码,因 Android 版本而异)。

    请不要管 AsyncTask 线程。

    来源问题: AsyncTask threads never die

    【讨论】:

      【解决方案2】:

      我不确定这是否相关,但我在我的一个应用程序中也遇到了类似的问题。

      我有一个初始化 TimerTask 线程的活动。任务在指定的时间间隔内正确执行,但经过一些空闲时间后,这些线程的数量似乎增加了(表明线程保持打开状态并创建了新线程)。问题是 Android VM 动态加载和卸载我的应用程序。原始线程从未被杀死,因为在每次新加载应用程序时,线程初始化都会发生。这就是为什么我的应用程序中的线程总数过去常常增加的原因。

      您的应用程序中是否也有类似的实现。

      【讨论】:

      • 不,我没有在创建 AsyncTasks 时创建线程,无论如何都是一次性的。
      【解决方案3】:

      你应该使用

      thread.join
      

      确保线程完成。你这样做吗?

      【讨论】:

      • 不要认为这适用于 AsyncTask()。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2016-01-02
      • 2021-09-29
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多