2011-02-07 93 views
12

在我的应用程序中,我有一个UI类的东西,其名称是“SettingActivity”。为什么AsyncTask在应用程序的主线程中运行?

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

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

那么有人知道为什么会发生这种情况?

代码如下:

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

Then I will get main as the output.

+1

如果您可以发布一些示例代码,这将是有帮助的。 – 2011-02-07 07:06:10

回答

23

An AsyncTask has several parts: a doInBackground实际上在单独的线程上运行的方法以及在UI线程上运行的onPostExecute方法。 onPostExecute的用途是发布必须在UI线程上完成的结果(例如更新视图层次结构或设置文本视图中的文本)。它也可以发布进度更新。为了使这一切正常工作,必须创建AsyncTask,并在UI线程上调用execute方法。

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

+0

谢谢你的回答。真的帮了我很多〜 – Mathieu 2011-02-08 04:45:55

6

事实上,我已经检查)的Android的文档, onPreExecute(,onProgressUpdate(进步...)和onPostExecute(结果)都 “调用UI线程上”。

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

相关问题