【问题标题】:Best way to send HTTP GET requests ansynchronously in Android?在 Android 中异步发送 HTTP GET 请求的最佳方式?
【发布时间】:2013-06-01 18:09:33
【问题描述】:

在 Android 应用中,我必须向一个 URL 发出多个 GET 请求,以便将数据传输到外部服务器(这就是第三方 API 的工作方式)。

数据偶尔会出现。我将此数据存储在一个队列中,并希望在后台异步将其发送到服务器,而不会减慢主 UI 线程的速度。队列中的每个数据单元都需要一个 GET 请求。即使应用关闭,队列也必须清空。

执行此操作的最佳做​​法是什么?请张贴/指导我查看代码/教程。

【问题讨论】:

    标签: android multithreading asynchronous httprequest background-process


    【解决方案1】:

    您可以使用AsyncTask 进行自己的异步 HTTP GET 调用,但我建议您不要这样做,除非您是从学习的角度进行操作。如果您想要一个好的、干净且稳定的解决方案,我建议您使用众所周知的Android Asynchronous Http Client 3rd 方库。来自网站:

    “一个基于异步回调的 Android Http 客户端,构建在 Apache 的 HttpClient 库之上。所有请求都在应用程序的主 UI 线程之外发出,但任何回调逻辑都将在使用创建回调的同一线程上执行Android 的 Handler 消息传递。”

    制作 GET 很简单:

    AsyncHttpClient client = new AsyncHttpClient();
    client.get("http://www.google.com", new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(String response) {
            System.out.println(response);
        }
    });
    

    【讨论】:

    • 如果应用关闭会怎样?
    • 我认为当前的异步请求将完成,但我实际上不确定。
    • 漂亮的图书馆。在我的新项目中尝试一下。谢谢
    【解决方案2】:

    这样做的最佳做法是什么?

    这将取决于“这个”是什么以及这项工作在哪里完成。

    如果“this”是“异步工作”,您将以一种形式或方式使用线程:

    • 如果您的 HTTP 操作正在驱动 UI,您可以使用 AsyncTask,因此您可以从 onPostExecute() 安全地更新 UI

    • 如果您的 HTTP 操作完全在后台进行,并且您想一次执行一个,请使用 IntentService,它有自己的后台线程和工作队列

    • 1234563
    • 如果您的 HTTP 操作纯粹在后台进行,但您想一次执行多个操作,请使用您自己的线程池使用 Executor您在工作完成后关闭该服务(就像 IntentService 所做的那样),并确保设备保持唤醒状态并使用 WakeLock(可能还有 WifiLock

    如果“this”是“HTTP GET”请求,使用:

    • HttpUrlConnection,或

    • HttpClient,或

    • OkHttp(围绕那些具有额外好处的包装),或

    • Retrofit(如果您的 GET 请求确实是 Web 服务调用),或者

    • Volley(如果您希望您的 HTTP 包装器代码未记录、不受支持,但 Googly)

    • 任意数量的其他第三方包装库

    如果“this”是“queue”,请使用 Queue 类,如果您打算让多个线程同时使用它,请使用 LinkedBlockingQueue

    如果“这个”是别的意思,我帮不了你,因为我已经猜不透了。

    【讨论】:

    • 注意:Volley 现在是推荐的最佳实践,受支持,记录在案,并且不仅适用于 GET 请求。
    • @Nilzor:“推荐的最佳实践”——请提供指向 developer.android.com 上表明这一点的页面的链接。 “支持,记录在案”——请提供指向正在进行支持和文档所在的某个站点(例如 GitHub 存储库)的链接。 “不仅适用于 GET 请求”——我从未说过它适用于 GET 请求。 问题是关于GET请求的。
    • 我有点快,以为您在 AsyncTasks 中推广 HTTP 调用,但事实并非如此。不幸的是,谷歌似乎仍在宣传自己(developer.android.com/training/basics/network-ops/…),这对于大多数用例(例如 JSON 请求)在性能和可靠性方面是一种不好的做法。你是对的,它仍然没有得到 Android 团队的正式支持,也没有记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多