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

Android 为什么AsyncTask在应用程序的主线程中运行?,android,multithreading,android-asynctask,Android,Multithreading,Android Asynctask,在我的应用程序中,我有一个UI类,其名称是“SettingActivity” 然后为了在后台执行一些工作,我将这个UI类(SettingActivity)绑定到一个服务。 该服务中有两个预定义的方法(在.aidl文件中定义),一个是startTask(),另一个是stopTask() 在startTask()中,我调用了一个异步任务。但是当我检查这个异步任务的循环器的名称时。它是“主要的”。在我看来,异步任务应该启动主线程以外的另一个线程 有人知道为什么会这样吗 代码如下: @凌驾 受保护的v

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

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

在startTask()中,我调用了一个异步任务。但是当我检查这个异步任务的循环器的名称时。它是“主要的”。在我看来,异步任务应该启动主线程以外的另一个线程

有人知道为什么会这样吗

代码如下:

@凌驾 受保护的void onPreExecute(){ super.onPreExecute(); Log.d(标记“onPreExecute”+Looper.myLooper().getThread().getName()); }


然后我将以main作为输出。

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


你不能从
doInBackground
中调用UI操作——这样做会使你的应用程序崩溃。

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


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

如果您可以发布一些示例代码,这将很有帮助。例如,如果我想在单独的线程上制作Toast,我应该怎么做?@Behzad-如果您有活动的引用,您可以使用
runOnUiThread
,如中所述。@TedHopp-+1。它并没有真正把线分开!我的意思是,如果我运行一个单独的线程,并在其中运行一个更新UI的函数(使用runOnUitThread),它将进入UI线程池并在队列中运行。我说得对吗?我想干杯,同时做其他事情(都更新UI)。这可能吗?@Behzad-如果您正在运行工作线程,并将
Runnable
传递给
rununuithread
,那么
Runnable
将在将来某个时间(通常很快)排队在UI线程上运行,对
rununuithread
的调用将立即返回。然后,您可以继续在工作线程中执行其他操作(包括对
runOnUiThread
的其他调用),无论UI线程是否执行了您作为参数传递的任何
Runnables
。我也有类似的问题。我正在从
Application
类启动服务,我的服务中有
AsyncTask
,我正在
doInBackground()
方法中下载一些项目。有时
doInBackground()
在异步任务线程中,有时在主线程中。有什么想法吗? @Override protected void onPreExecute() { super.onPreExecute(); Log.d(TAG, "onPreExecute "+Looper.myLooper().getThread().getName()); }