我看过很多例子,它们似乎都以不同的方式解决了这个问题。基本上,我只是想要最简单的方法来发出不会锁定主线程并且可以取消的请求。
这也无济于事,我们至少有2个HTTP库可供选择,它们分别是java.net。*(例如HttpURLConnection)和org.apache.http。*。
最佳实践是什么?
最佳答案
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
做任何您想做的事情,但是它们可能会更难使用,而且我发现对于简单的GET
请求,它们的执行效果也不佳(在Android上)。