2013-01-23 86 views
4

是必须的,我们必须从UI线程启动和执行asyctask。它是正确的,如果我使用asynctask从非UI线程的Web服务访问(长时间运行)。 对不起,如果我的查询是错误的。Asynctask从非UI线程

在我的应用程序我要运行约10 web服务,并有上显示的用户界面。我很困惑,其做法将是很好的AsyncTask,intentservice或创建的每个Web服务调用线程并使其运行并行的结果。

+1

只需使用普通线程? – PearsonArtPhoto

+0

我的答案试一下......你可以重复使用相同的代码来调用不同类型的Web服务而不会阻塞UI线程 – Pragnani

回答

0

是的,需要从UI线程运行asynctask。

我会建议使用多线程/可运行的。您还需要在主要活动类中实现一个处理程序来侦听来自线程的响应。

2

有一些线程规则必须遵循的AsyncTask正常工作:

  1. 的的AsyncTask类必须在UI线程加载。这从JELLY_BEAN自动完成。

  2. 任务实例必须在UI线程上创建。

  3. execute(Params ...)必须在UI线程上调用。

  4. 不要手动调用onExExecute(),onPostExecute(Result),doInBackground(Params ...),onProgressUpdate(Progress ...)。

  5. 任务只能执行一次(如果第二试图执行一个异常将被抛出。)

    Further Details

在我个人看来,我会建议使用的AsyncTask,因为它针对运行后台任务和利用多核处理器等优势进行了高度优化。

+1

这是错误的,一个'IntentService'不需要一个AsyncTask,它已经在后台运行了'IntentService是服务的基类,可以根据需要处理ASYNCHRONUS请求(表示为Intents)。“#http://developer.android.com/reference/android/app/IntentService.html – tyczj

+0

@tyczj你说的是真的,但拉胡尔的回答也是如此,尽管它可能*不会回答OP。他没有使用AsyncTask对IntentService进行任何说明。我怀疑OP需要IntentService。 – Simon

+0

@Simon是的我只是在谈论intentservice部分是错误的 – tyczj

0

你可以去任何线程或asynctask。 AsyncTask为您提供了在启动后台任务之前以及完成后台任务或获取其进度之前管理UI更改方法的方法。

这取决于您的架构要求。