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

Mat*_*ieu 13 multithreading android android-asynctask

在我的应用程序中,我有一个UI类的东西,其名称是"SettingActivity".

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

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

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

代码如下: __CODE__

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

Ted*_*opp 27

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

您不能从内部调用UI操作doInBackground- 这样做会导致应用程序崩溃.


Mat*_*ieu 9

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

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