当前位置: 首页 > 面试题库 >

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

皇甫飞宇
2023-03-14
问题内容

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

这也无济于事,我们至少有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);
   }
}

doInBackgroundThread在单独的线程(由线程池管理ExecutorService)上调用该方法,并将结果传递给onPostExecute在UI线程上运行的方法。你可以叫cancel(boolean mayInterruptIfRunning)上你的AsyncTask子类来取消正在运行的任务。

至于使用java.netorg.apache.http库进行网络访问,则取决于您。我发现在java.net尝试发出a
GET和读取结果时,这些库使用起来很安静。这些org.apache.http库将使您几乎可以做任何您想做的事情HTTP,但是它们使用起来可能会有点困难,我发现对于简单的GET请求,它们的性能不佳(在Android上)。



 类似资料:
  • 场景:我需要从web应用程序的API收集分页数据,该API的调用限制为每分钟100次。我需要返回的API对象每页包含100个项目,总共105个页面,并且在不断增长(~10500个项目)。同步代码检索所有页面大约需要15分钟,因此不必担心达到调用限制。但是,我想加快数据检索速度,因此我使用和实现了异步调用。数据现在可以在15秒内下载-很好。 问题:我现在达到呼叫限制,因此在过去的5个左右的呼叫中收到

  • 问题内容: 我有一个PHP脚本,需要从远程服务器下载多个文件。目前,我只有一个循环使用cURL下载和处理文件,这意味着它直到下一个文件完成后才开始下载一个文件- 这大大增加了脚本的运行时间。 是否可以启动多个cURL实例,例如,同时异步下载这些文件而无需等待上一个实例完成?如果是这样,将如何实现? 问题答案: 是。 有一个multirequest PHP库 (或参见:已归档的Google Code

  • 问题内容: 发出HTTP DELETE请求时,请求URI应该完全标识要删除的资源。但是,是否可以在请求的实体中添加额外的元数据? 问题答案: 612 该规范没有明确禁止或阻止它,因此我倾向于说它是允许的。 微软认为它以同样的方式(我可以听到观众低声),他们MSDN文章关于国有ADO.NET数据服务框架的删除方法: 如果DELETE请求包含实体主体,则将忽略该主体[…] 另外,这是RFC2616(H

  • 问题内容: 如何在AngularJS中阻止HTTP请求,以便我可以在下一行使用$ http响应? 在下面的示例中,object不会将结果返回到下一行,因此我可以将此结果传递给JavaScript库,因为它返回空白值。 这是示例代码: 问题答案: 您可以为此使用诺言。 这是一个例子:

  • 我希望我的请求触发一些长时间运行的操作,这些操作应该在后台执行。我编写了以下实现,应该在后台处理我的操作,但实际上我的请求是同步执行的: 在日志中,我看到以下内容: 我看到我的在另一个线程中执行,但出于某种原因,我的原始请求等待sleep完成 更新1:

  • 我有2个微服务(A和B)。 有一个接受POST请求的endpoint。当用户发出发布请求时,会发生以下情况: 服务A从POST请求正文中获取对象并将其存储在数据库中。 服务A将对象转换为不同的对象。新对象通过泽西HTTP客户端发送到服务B。 步骤 2 发生在我创建的 Java 线程池(Executors.new缓存线程池)上。通过在新线程上执行步骤 2,服务 A 的终结点的响应时间不受影响。 但是