在Android中进行asynchronousHTTP请求是否有一个公认的最佳做法?

我已经看到了许多例子,他们似乎都以不同的方式解决这个问题。 基本上我只想要最简单的方法来使请求不会locking主线程,并可以取消。

这也没有帮助,我们有(至less)2个HTTP库可供select,java.net。*(如HttpURLConnection)和org.apache.http。*。

对最佳做法有何共识?

Android 1.5 SDK引入了一个新类, AsyncTask被devise用来在后台线程上运行任务,并将结果传递给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方法在单独的线程(由线程池ExecutorServicepipe理)上调用,并将结果传递给在UI线程上运行的onPostExecute方法。 您可以调用AsyncTask子类的cancel(boolean mayInterruptIfRunning)来取消正在运行的任务。

至于使用java.netorg.apache.http库进行networking访问,取决于您。 我发现java.net库是安静愉快使用时,只是试图发出一个GET并阅读结果。 org.apache.http库可以让你几乎做任何你想要的东西,但是它们可能会更难以使用,而且我发现它们在Android上对于简单的GET请求不是很好(在Android上)。

实际上在AsyncTasks的devise中存在一些缺陷,使其不能真正用于networking。 一个简单的例子是,你将失去你的AsyncTask和你的活动之间的链接…只是通过旋转你的设备。

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

AsyncTask文档清楚地表明:AsyncTask只能用于短期生活任务,而且显然,networking不属于这个类别。

所以,我真的build议你看看RoboSpice 。 这个库已经被devise用于asynchronousnetworking,这是一个非常强大的方法来实现它。 如果你只有几秒钟的信心 ,看看这个信息 。

RoboSpice也作为商店上的演示应用程序: RoboSpice的动机 ,将深入解释关于Android上的asynchronousnetworking的一切。

怎么样一个AsyncTask引用一个静态保留的片段 (没有UI)在一个活动或另一个片段? 没有内存泄漏,在单独的线程中优雅的asynchronous操作,没有对象引用的损失。

我认为这对于http请求是可以的,但对file upload/下载不适用。 如果你仔细阅读,有一句话:

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

但是他们没有提到,一个单独的线程服务也是一个不错的select。 这是为了继续在后台执行任务,不pipe用户做什么。 (dg如果他上传了一些你不想阻止的文件,因为他已经离开了这个活动)

这个样本链接 – findRetainedFragment.java

这个链接为AsyncTask。

您可以使用Android的asynchronous任务。 为了使http请求可以使用HttpURLConnection类。