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