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

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

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

最佳实践是什么?

Jeremy Logan asked 2020-08-12T03:42:49Z
4个解决方案
35 votes

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);
   }
}

在单独的线程(由线程池300758559259202040961管理)上调用java.net方法,并将结果传递给在UI线程上运行的java.net方法。 您可以在org.apache.http子类上调用GET,以取消正在运行的任务。

至于使用java.net或300758559259202040961库进行网络访问,则取决于您。 我发现java.net库在尝试发布GET并读取结果时非常安静且易于使用。 org.apache.http库将允许您使用HTTP做几乎任何您想做的事,但是它们使用起来可能会有点困难,我发现它们对简单的GET请求而言表现不佳(在Android上)。

jargonjustin answered 2020-08-12T03:43:06Z
12 votes

实际上,在AsyncTasks的设计中存在一些缺陷,使它无法真正用于网络。 一个简单的例子是,只需旋转设备,即可松开AsyncTask和Activity之间的链接。

看一下这个线程:您将看到AsyncTask也很容易造成内存泄漏。

AsyncTask文档对此很明确:AsyncTask仅应用于短期任务,而且显然,网络不属于该类别。

所以,我真的建议您看看RoboSpice。 该库是为异步网络设计的,它是一种非常健壮的实现方式。如果只有几秒钟可以说服,请查看此信息。

RoboSpice还是商店中的演示应用程序:RoboSpice Motivations,将深入介绍有关Android上异步网络的所有内容。

Snicolas answered 2020-08-12T03:43:45Z
1 votes

AsyncTask引用活动或其他片段中托管的静态保留片段(无UI),该怎么办? 没有内存泄漏,在单独的线程中进行了优雅的异步操作,没有对象引用丢失。

我认为这对于HTTP请求是可以的,但对于文件上传/下载来说不行。 如果您仔细阅读,则有一个句子:

如果需要使线程长时间运行,则强烈建议您使用java.util.concurrent包提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask。

但是他们没有提到,带有单独线程的服务也是一个不错的选择。 这意味着无论用户做什么,都可以在后台继续执行任务。 (例如,如果他上传了一些文件,则您不想停止此操作,因为他已退出活动)

此示例链接-查找RetainedFragment.java

此链接用于AsyncTask。

PaN1C_Showt1Me answered 2020-08-12T03:44:29Z
-1 votes

您可以使用Android异步任务。 要发出http请求,可以使用HttpURLConnection类。

Ashish Vora answered 2020-08-12T03:44:49Z
translate from https://stackoverflow.com:/questions/828280/is-there-an-accepted-best-practice-on-making-asynchronous-http-requests-in-andro