【发布时间】:2012-11-09 13:45:58
【问题描述】:
我们应该从IntentService 的onHandleIntent() 方法中启动异步任务吗?我读到onHandleIntent() 在worker thread 中运行,所以从那里开始asyncTask 是否安全??
【问题讨论】:
标签: android android-asynctask worker
我们应该从IntentService 的onHandleIntent() 方法中启动异步任务吗?我读到onHandleIntent() 在worker thread 中运行,所以从那里开始asyncTask 是否安全??
【问题讨论】:
标签: android android-asynctask worker
IntentServices 已经是后台进程;无需从那里启动 AsyncTask。 此外,从任何地方开始 它是一个帮助您实现多线程的辅助类。如果您在 Activity 中使用 AsyncTask 都是“安全的”;Views,请确保不要在 AsyncTask 的 doInBackground()-method 中操作它。
如果您需要在 IntentService 中生成多个线程,只需使用:
new Thread(Runnable r).start();
查看How to run a Runnable thread in Android?的示例
如果您需要调用某种回调,请使用Handler。示例见http://www.vogella.com/articles/AndroidPerformance/article.html#handler
【讨论】:
AsyncTask 都不安全:stackoverflow.com/questions/4187960/… - 它只打算从主线程启动,如果你在 onHandleIntent 内启动它可能会起作用,因为它有一个 Looper
onHandleIntent(Intent intent) 方法中下载文件。它在所有设备和各种操作系统中都能正常工作。
AsyncTask 类用于提供实现多线程的机制,所以你的事件线程不会被挂起,但是当你使用服务时,你不应该在服务中使用 AsyncTask,你可以使用线程,如果有的话长时间运行的任务将在服务中执行。
【讨论】:
如果您确实需要在 IntentService 中使用 AsyncTask,您可以在 AsyncTask 中创建一个调用 de doInBackGround 和 onPostExecute 的方法。像这样的:
void executeFlowOnBackground(Params params) {
onPostExecute(doInBackground(params));
}
在我的情况下,我这样做是因为所有 App 请求都是由扩展 AsyncTask 的类发出的,并且由于实现难以重构代码。
【讨论】: