在我的应用程序中,我有一个用于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作为输出。
答案 0 :(得分:26)
AsyncTask有几个部分可以覆盖:事实上,doInBackground
方法在一个单独的线程上运行,还有三个方法 - onPreExecute
,onProgressUpdate
和{ {1}} - 在UI线程上运行。 (这些方法的默认实现不执行任何操作,onPostExecute
仅在您onProgressUpdate
内调用时才会运行。publishProgress
的目的是发布结果(如{1}}更新视图层次结构,或在文本视图中设置文本,必须在UI线程上完成。它还可以发布进度更新。为了使这一切正常工作,必须在UI线程上创建AsyncTask,并调用doInBackground
方法。
您不得在onPostExecute
内调用UI操作 - 否则会导致应用程序崩溃。
答案 1 :(得分:8)
事实上,我已经检查了android的文档, onPreExecute(),onProgressUpdate(Progress ...)和onPostExecute(Result)都是“在UI线程上调用的”。
仅在后台线程上“调用 doInBackground(Params ...)方法”。