我见过很多例子,他们似乎都以不同的方式解决了这个问题。基本上我只想要最简单的方法来发出不会锁定主线程并且可以取消的请求。
我们(至少)有2个HTTP库可供选择,java.net。*(例如HttpURLConnection)和org.apache.http。*也没有帮助。
对最佳做法有什么共识?
答案 0 :(得分:34)
Android 1.5 SDK引入了一个新类AsyncTask,旨在使后台线程上运行任务并将结果传递给UI线程更简单一些。 Android Developers Blog中给出的示例给出了如何使用它的基本概念:
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
管理),并将结果传递给在UI线程上运行的onPostExecute
方法。您可以在cancel(boolean mayInterruptIfRunning)
子类上调用AsyncTask
来取消正在运行的任务。
至于使用java.net
或org.apache.http
库进行网络访问,这取决于您。我发现只需尝试发出java.net
并阅读结果时,GET
库就可以安静使用。 org.apache.http
库允许您使用HTTP
执行几乎任何操作,但它们可能会更难以使用,我发现它们在Android上的表现不如简单{{ 1}}请求。
答案 1 :(得分:12)
实际上,AsyncTasks的设计存在一些缺陷,使其无法真正用于网络。一个简单的例子就是您将通过旋转设备来松开AsyncTask和Activity之间的链接。
看一下this thread:你会发现AsyncTask也很容易造成内存泄漏。
AsyncTask文档清楚地表明:AsyncTask只应用于短期生活任务,而且显然,网络不属于该类别。
所以,我真的建议你看看RoboSpice。该库专为异步网络而设计,它是一种非常强大的实现方式。 如果您只有几秒钟的时间来确信,请查看此inforgraphics。
RoboSpice也作为商店的演示应用程序:RoboSpice Motivations,它将解释有关Android上异步网络的所有内容。
答案 2 :(得分:1)
AsyncTask
如何引用活动或其他片段中托管的静态保留片段(没有用户界面)?没有内存泄漏,在单独的线程中优雅的异步操作,没有对象引用丢失。
我认为这对于http请求是可以的,但不适用于文件上传/下载。如果你仔细阅读,有一句话:
如果您需要保持线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask。 < / p>
但是他们没有提到,带有单独Thread的service也是一个不错的选择。这意味着无论用户做什么,都要在后台继续执行任务。 (例如,如果他上传了一些文件,你不想因为他已离开活动而停止此活动)
此样本的link - 找到RetainedFragment.java
AsyncTask的这个link。
答案 3 :(得分:-1)
您可以使用Android的Async Task。要发出http请求,您可以使用HttpURLConnection类。