AsyncTask或Handler-哪个更适合耗时的网络交互和处理?

时间:2012-01-20 12:54:57

标签: android multithreading progressdialog

我是Android开发的新手。目前我正在开发一个应用程序,它将从用户那里获取查询,将查询发送到服务器并将收到XML响应作为回报。然后它将使用XMLparser处理xML响应,将从XML响应中提取答案并向用户显示答案。由于所有这些处理都需要一些时间,因此我想向用户显示一个进度对话框,以了解所需的处理时间。

我已经通过一些方法来完成这项工作,就像我可以使用AsyncTask,Handler或Runnable(java)线程一样。但是,尽管我已经阅读了所有这些内容,但我很困惑使用哪一个。 请告诉我哪一个更适合用于上述场景。并且是实现首选方法的简单方法。

提前谢谢你。

8 个答案:

答案 0 :(得分:2)

我建议您使用AsyncTask,因为它比其他方法更简单,并且它适合您的需求。

我认为你把这三个不同的实体搞得一团糟:

AsyncTask在一个单独的线程中运行一组操作,可以在其工作期间显示进度,并在任务完成时显示通知。

Runnable是一个可以执行的命令。你应该在一个单独的线程中运行。此外,您应该在这种情况下开发一个逻辑,如何更新进度以及在任务完成时如何通知。

Handler是一个特殊的类,可以处理发送给处理程序线程的消息。

答案 1 :(得分:2)

来自http://developer.android.com/reference/android/os/AsyncTask.html

  

此类允许在UI线程上执行后台操作和发布结果,而无需操作线程和/或处理程序。

AsyncTask旨在用于与您非常相似的用途。

Runnable只是在另一个线程上运行一段代码:

  

表示可以执行的命令。通常用于在不同的Thread中运行代码。   (http://developer.android.com/reference/java/lang/Runnable.html)

Handler更多地用于消息队列。您的案例似乎不需要重复发送邮件。

  

Handler有两个主要用途:(1)安排消息和runnables作为将来的某个点执行; (2)将要在不同于自己的线程上执行的操作排入队列。   http://developer.android.com/reference/android/os/Handler.html

请注意,Runnable和Handler都没有谈论在UI线程上显示结果。这就是AsyncTask比其中任何一个都更有帮助的地方。

答案 2 :(得分:1)

这可能是我个人的偏好 - 但我会在你的情况下使用AsyncTask。它提供了启动任务,必要时更新进度等所有必要的控件。我的应用程序中有一个非常相似的要求(向服务器发送请求,在XML中获取响应,解析响应,对数据执行某些操作) - 我为此目的使用AsyncTasks。

答案 3 :(得分:0)

据我所知,AsyncTask是推荐的方式。我认为这是最简单的实现方式,也是异步任务的“Android最佳实践”。

你能参考这个question

吗?

答案 4 :(得分:0)

以下是我的看法。

Handler更多用于排队许多操作,并提供更多控制。对于通常不限于UI的重复性任务,它会更好。

AsyncTask提供了一种简单的方法来进行后台处理,而不是关心较低级别的内容。这对于相对较小的个人UI更新非常有用。

IMO,您应该使用AsyncTask。话虽如此,这是一种折腾。

答案 5 :(得分:0)

我认为这是一个自我偏好的问题,但在你的情况下我会选择AsyncTask,因为它促进了UI线程和后台线程之间的交互。

答案 6 :(得分:0)

我会使用AsyncTaskHandler的组合,因为请记住您无法从UI线程外部更改UI(在这种情况下,您无法干预并向用户显示答案) )。

为了解决这个问题,我运行了AsyncTask并使用自定义回调方法捕获结果,该方法只是将其封装在Message中并将其发送到我的自定义Handler,该自定义{{1}}位于UI线程内部并且可以安全地在屏幕上呈现我的结果。

答案 7 :(得分:0)

AsyncTask可能是选择,因为它提供了启动异步任务,更新进度条等所需的所有控件。

但是,重点是AsyncTask是该场景的最佳解决方案。 Handler或Runnable更适合双工案例,如聊天应用程序。