【问题标题】:AsyncTask or Handler- Which one is better for time consuming network interaction and processing?AsyncTask 或 Handler - 哪个更适合耗时的网络交互和处理?
【发布时间】:2012-01-20 12:54:57
【问题描述】:

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

我已经通过一些方法来做到这一点,比如我可以使用 AsyncTask、Handler 或 Runnable (java) 线程。但是,尽管我已经阅读了所有这些内容,但我对使用哪一个感到困惑。 请告诉我哪一个更适合用于上述场景。还有一种实现首选方法的简单方法。

提前谢谢你。

【问题讨论】:

    标签: android multithreading progressdialog


    【解决方案1】:

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

    我认为你把这三个不同的实体弄乱了:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      AsyncTask 的用途与您的用途非常相似。

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

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

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

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

      请注意,Runnable 和 Handler 都没有谈论在 UI 线程上显示结果。这就是 AsyncTask 对您的帮助超过上述任何一个的地方。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          可以参考一下这个question

          【讨论】:

            【解决方案5】:

            这是我的看法。

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

            AsyncTask 提供了一种简单的后台处理方式,不太关心底层的东西。它非常适合相对较小的、单独的 UI 更新。

            IMO,您应该使用AsyncTask。话虽这么说,但这是一种折腾。

            【讨论】:

              【解决方案6】:

              我认为这是个人喜好问题,但在你的情况下,我会选择AsyncTask,因为它有助于 UI 线程和后台线程之间的交互。

              【讨论】:

                【解决方案7】:

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

                为了克服这个问题,我运行了 AsyncTask 并使用自定义回调方法捕获了结果,该方法简单地将其封装在 Message 中并将其发送到我的自定义 Handler,它位于 UI 线程内并且可以安全地呈现在屏幕上显示我的结果。

                【讨论】:

                  【解决方案8】:

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

                  但是,关键是 AsyncTask 是该场景的最佳解决方案。 Handler 或 Runnable 更适合双工情况,例如聊天应用。

                  【讨论】:

                    猜你喜欢
                    • 2019-11-26
                    • 2011-11-27
                    • 1970-01-01
                    • 2012-12-05
                    • 1970-01-01
                    • 2011-10-12
                    • 2010-12-14
                    • 1970-01-01
                    • 2010-09-18
                    相关资源
                    最近更新 更多