在 Android 应用程序中,我必须向 URL 发出多个 GET 请求,以便将数据传输到外部服务器(这就是第三方 API 的工作方式)。
数据偶尔出现。我将此数据存储在一个队列中,并希望在后台异步将其发送到服务器,而不会减慢主 UI 线程的速度。队列中的每个数据单元都需要一个 GET 请求。即使应用程序关闭,队列也必须清空。
这样做的最佳做法是什么?请张贴/指导我到代码/教程。
在 Android 应用程序中,我必须向 URL 发出多个 GET 请求,以便将数据传输到外部服务器(这就是第三方 API 的工作方式)。
数据偶尔出现。我将此数据存储在一个队列中,并希望在后台异步将其发送到服务器,而不会减慢主 UI 线程的速度。队列中的每个数据单元都需要一个 GET 请求。即使应用程序关闭,队列也必须清空。
这样做的最佳做法是什么?请张贴/指导我到代码/教程。
这样做的最佳做法是什么?
这将取决于“这个”是什么以及这项工作在哪里完成。
如果“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
如果您计划让多个线程同时使用它。
如果“这个”是别的东西,我无法帮助你,因为我已经厌倦了猜测。
您可以使用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);
}
});