在 Android 中发出异步 HTTP 请求是否有公认的最佳实践?
我看过很多例子,它们似乎都以不同的方式解决了这个问题。基本上,我只想要最简单的方法来发出不会锁定主线程且可取消的请求。
我们(至少)有2个HTTP库可供选择,java.net.*(如HttpURLConnection)和org.apache.http.*,这也无济于事。
对于什么是最佳实践,是否有任何共识?
我看过很多例子,它们似乎都以不同的方式解决了这个问题。基本上,我只想要最简单的方法来发出不会锁定主线程且可取消的请求。
我们(至少)有2个HTTP库可供选择,java.net.*(如HttpURLConnection)和org.apache.http.*,这也无济于事。
对于什么是最佳实践,是否有任何共识?
Android 1.5 SDK 引入了一个新类 AsyncTask,旨在使在后台线程上运行任务并将结果传达给 UI 线程变得更加简单。Android 开发人员博客中给出的一个示例给出了如何使用它的基本思路:
public void onClick(View v) {
new DownloadImageTask().execute("http://example.com/image.png");
}
private class DownloadImageTask extends AsyncTask {
protected Bitmap doInBackground(String... urls) {
return loadImageFromNetwork(urls[0]);
}
protected void onPostExecute(Bitmap result) {
mImageView.setImageBitmap(result);
}
}
该方法在单独的线程(由池线程管理)上调用,并将结果传达给在 UI 线程上运行的方法。您可以调用子类来取消正在运行的任务。doInBackgroundThread
ExecutorService
onPostExecute
cancel(boolean mayInterruptIfRunning)
AsyncTask
至于使用 或 库进行网络访问,这取决于您。我发现这些库在简单地尝试发布和阅读结果时使用起来很安静。这些库将允许您执行几乎任何您想要的操作,但是它们可能有点难以使用,并且我发现它们对于简单的请求(在Android上)不能很好地执行。java.net
org.apache.http
java.net
GET
org.apache.http
HTTP
GET
实际上,AsyncTasks 的设计中存在一些缺陷,这些缺陷阻止了它真正用于网络。一个简单的例子是,您将失去AsyncTask和活动之间的链接...只需旋转您的设备。
看看这个线程 :你会看到AsyncTask也很容易创建内存泄漏。
AsyncTask 文档很清楚这一点:AsyncTask 应该只用于短期的生存任务,而且,毫无疑问,网络不属于这一类。
所以,我真的建议你看看RoboSpice。此库是为异步网络而设计的,它是实现它的一种非常可靠的方法。如果您只有几秒钟的时间被说服,请看一下此信息图。
RoboSpice也作为商店的演示应用程序:RoboSpice Motivations,将深入解释有关Android上异步网络的所有内容。