为什么AsyncTask在应用程序的主线程中运行?

时间:2011-02-07 07:00:43

标签: android multithreading android-asynctask

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

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

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

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

代码如下:

@Override
    protected void onPreExecute() {
        super.onPreExecute();
        Log.d(TAG, "onPreExecute "+Looper.myLooper().getThread().getName());
    }

然后我将把main作为输出。

2 个答案:

答案 0 :(得分:26)

AsyncTask有几个部分可以覆盖:事实上,doInBackground方法在一个单独的线程上运行,还有三个方法 - onPreExecuteonProgressUpdate和{ {1}} - 在UI线程上运行。 (这些方法的默认实现不执行任何操作,onPostExecute仅在您onProgressUpdate内调用时才会运行。publishProgress的目的是发布结果(如{1}}更新视图层次结构,或在文本视图中设置文本,必须在UI线程上完成。它还可以发布进度更新。为了使这一切正常工作,必须在UI线程上创建AsyncTask,并调用doInBackground方法。

您不得在onPostExecute内调用UI操作 - 否则会导致应用程序崩溃。

答案 1 :(得分:8)

事实上,我已经检查了android的文档, onPreExecute(),onProgressUpdate(Progress ...)和onPostExecute(Result)都是“在UI线程上调用的”。

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