【问题标题】:Why does AsyncTask run in the main Thread of an application?为什么 AsyncTask 在应用程序的主线程中运行?
【发布时间】:2011-02-07 07:00:43
【问题描述】:

在我的应用程序中,我有一个 UI 类,其名称是“SettingActivity”。

然后为了在后台做一些工作,我将这个 UI 类(SettingActivity)绑定到一个服务。 该Service中有两个预定义的方法(定义在.aidl文件中),一个是startTask(),另一个是stopTask()。

在 startTask() 中,我调用了一个 AsyncTask。但是当我检查这个 AsyncTask 的 Looper 的名字时。它是“主要的”。在我看来,AsyncTask 应该启动除主线程之外的另一个线程

那么有人知道为什么会这样吗?

代码如下:

@Override
    受保护的无效onPreExecute(){
        super.onPreExecute();
        Log.d(TAG, "onPreExecute "+Looper.myLooper().getThread().getName());
    }

然后我将 main 作为输出。

【问题讨论】:

  • 如果你能发布一些示例代码会很有帮助。

标签: android multithreading android-asynctask


【解决方案1】:

一个 AsyncTask 有几个部分可以覆盖:一个 doInBackground 方法,实际上在单独的线程上运行,以及三个方法——onPreExecuteonProgressUpdateonPostExecute——运行在用户界面线程。 (这些方法的默认实现什么都不做,onProgressUpdate 只有在你调用publishProgress 时才会运行,通常来自doInBackground。)onPostExecute 的目的是发布结果(例如更新视图层次结构,或设置文本视图中的文本)必须在 UI 线程上完成。它还可以发布进度更新。为了让这一切正常工作,必须在 UI 线程上创建 AsyncTask,并调用 execute 方法。

您不得在 doInBackground 中调用 UI 操作 - 这样做会使您的应用程序崩溃。

【讨论】:

  • 例如,如果我想在一个单独的线程上制作 Toast,我应该怎么做?
  • @Behzad - 如果您有对活动的引用,您可以使用runOnUiThread,如this answer 中所述。
  • @TedHopp - +1。它并没有真正分离线程!我的意思是,如果我运行一个单独的线程并在其中运行一个更新 UI 的函数(使用 runOnUitThread),它会进入 UI 线程池并在队列中运行。我对吗?我想干杯并同时做其他事情(都更新 UI)。这可能吗?
  • @Behzad - 如果您正在运行工作线程并将Runnable 传递给runOnUiThread,那么Runnable 将在未来某个时间排队在UI 线程上运行(通常非常很快),对runOnUiThread 的调用将立即返回。然后,您可以继续在工作线程中执行其他操作(包括对 runOnUiThread 的其他调用),无论 UI 线程是否已执行您作为参数传递的任何 Runnables
  • 我也有类似的问题。我正在从Application 类开始服务,我的服务中有AsyncTask,我正在doInBackground() 方法中下载一些项目。有时doInBackground() 在 AsyncTask 线程中,有时在主线程中。有什么想法吗?
【解决方案2】:

其实我查过android的doc, onPreExecute()、onProgressUpdate(Progress...) 和 onPostExecute(Result) 都是“在 UI 线程上调用的”。

只有 doInBackground(Params...) 方法“在后台线程上调用”。

【讨论】:

    猜你喜欢
    • 2015-08-16
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多