从onhandleintent开始异步任务

4
我们应该从IntentServiceonHandleIntent()方法中开始异步任务吗?我读到过onHandleIntent()工作线程中运行,那么从那里启动asyncTask是否安全?
3个回答

3
IntentService已经是后台进程,无需从此处启动AsyncTask。同时,从任何地方启动AsyncTask都是“安全”的;它是一个帮助你多线程的辅助类。只需确保在AsyncTaskdoInBackground()方法中不要操作View,如果您在Activity中使用它。
如果需要在IntentService内部产生多个线程,请使用:

new Thread(Runnable r).start();

请参见如何在Android中运行Runnable线程?示例。
如果需要调用某种回调,请使用Handler。有关示例,请参见http://www.vogella.com/articles/AndroidPerformance/article.html#handler

4
从任何地方启动一个AsyncTask都不安全:https://dev59.com/_W855IYBdhLWcg3wuGsM - 它只能从主线程启动,如果你在onHandleIntent中启动它,可能会起作用,因为它有一个Looper - zapl
1
如果我在onHandleIntent()中不使用asyncTask,那么其中的代码仍会在后台运行吗? - Rookie
1
@zapl,感谢您的评论。Raghav:只需调用您想要调用的方法;由于IntentService在不同的线程中运行,因此您的UI不会冻结。如果出于任何原因您想要在IntentService中生成多个线程,只需使用new Thread(Runnable r)。start();请参见https://dev59.com/jHI-5IYBdhLWcg3wTWdu上的示例。 - Reinier
@Rookie,是的,就我所知,我使用一种方法在onHandleIntent(Intent intent)方法内直接下载文件。并且在所有设备和各种操作系统中都能正常工作。 - Rumit Patel

0
如果您确实需要在IntentService内部使用AsyncTask,可以在AsyncTask中创建一个方法来调用doInBackground和onPostExecute。类似这样的内容:
void executeFlowOnBackground(Params params) {
  onPostExecute(doInBackground(params));
}

在我的情况下,我这样做是因为所有的应用程序请求都是由一个扩展了AsyncTask的类发起的,而且由于实现方式的复杂性,重构代码变得困难。

0

AsyncTask类用于提供一种机制来实现多线程,以便您的事件线程不会挂起,但是由于您正在使用服务,因此不应在服务中使用AsyncTask,而应该使用线程,如果需要执行某些长时间运行的任务,则可以在服务中使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接