在 Android 中发出异步 HTTP 请求是否有公认的最佳实践?

2022-09-01 02:09:00

我看过很多例子,它们似乎都以不同的方式解决了这个问题。基本上,我只想要最简单的方法来发出不会锁定主线程且可取消的请求。

我们(至少)有2个HTTP库可供选择,java.net.*(如HttpURLConnection)和org.apache.http.*,这也无济于事。

对于什么是最佳实践,是否有任何共识?


答案 1

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 线程上运行的方法。您可以调用子类来取消正在运行的任务。doInBackgroundThreadExecutorServiceonPostExecutecancel(boolean mayInterruptIfRunning)AsyncTask

至于使用 或 库进行网络访问,这取决于您。我发现这些库在简单地尝试发布和阅读结果时使用起来很安静。这些库将允许您执行几乎任何您想要的操作,但是它们可能有点难以使用,并且我发现它们对于简单的请求(在Android上)不能很好地执行。java.netorg.apache.httpjava.netGETorg.apache.httpHTTPGET


答案 2

实际上,AsyncTasks 的设计中存在一些缺陷,这些缺陷阻止了它真正用于网络。一个简单的例子是,您将失去AsyncTask和活动之间的链接...只需旋转您的设备。

看看这个线程 :你会看到AsyncTask也很容易创建内存泄漏。

AsyncTask 文档很清楚这一点:AsyncTask 应该只用于短期的生存任务,而且,毫无疑问,网络不属于这一类。

所以,我真的建议你看看RoboSpice。此库是为异步网络而设计的,它是实现它的一种非常可靠的方法。如果您只有几秒钟的时间被说服,请看一下此信息

RoboSpice也作为商店的演示应用程序:RoboSpice Motivations,将深入解释有关Android上异步网络的所有内容。


推荐