15

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

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

这样做的最佳做法是什么?请张贴/指导我到代码/教程。

4

2 回答 2

33

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

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

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

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

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

  • 如果您的 HTTP 操作纯粹在后台进行,并且您想一次执行一个操作,并且您担心确保设备在所有这些操作过程中保持唤醒状态,请考虑我的WakefulIntentService

  • 如果您的 HTTP 操作纯粹在后台进行,但您想一次执行多个操作,请Service使用Executor您自己的线程池推出自己的操作,确保在工作完成后关闭该服务(如IntentService确实),并确保设备通过 a WakeLock(也许是 a WifiLock)保持唤醒

  • 等等。

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

  • HttpUrlConnection, 或者

  • HttpClient, 或者

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

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

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

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

如果“this”是“queue”,请使用Queue该类,或者LinkedBlockingQueue如果您计划让多个线程同时使用它。

如果“这个”是别的东西,我无法帮助你,因为我已经厌倦了猜测。

于 2013-06-05T21:33:39.883 回答
8

您可以使用AsyncTask进行自己的异步 HTTP GET 调用,但我建议您不要这样做,除非您是从学习的角度进行操作。如果您想要一个漂亮、干净且稳定的解决方案,我建议您使用众所周知的Android 异步 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);
    }
});
于 2013-06-05T21:31:21.843 回答