在我的应用程序中,我使用以下代码下载多个图像。 是这样做的高性能还是我可以以某种方式重用连接?
for(int i = 0; i < 100; i++){
URL url = new URL("http://www.android.com/image" + i + ".jpg");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
readStream(in);
finally {
urlConnection.disconnect();
}
}
}
答案 0 :(得分:5)
重新使用HttpURLConnection
使您的应用程序大大受益的一件事是,如果您花一些时间研究异步任务,这将允许您利用对主代码的回调来利用多线程HTTP请求的强大功能。 / p>
请参阅: http://www.vogella.com/articles/AndroidPerformance/article.html 有关如何使用异步任务的一个很好的例子。
一个很好的起点当然是 Android开发者博客,他们有一个例子,可以异步地从服务器下载图像,这将很好地满足您的要求。通过一些调整,您可以让您的应用程序一次发送多个异步请求,以获得良好的性能。
可以在以下位置找到Google文章: http://android-developers.blogspot.co.uk/2009/05/painless-threading.html
要看的关键领域是:
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);
}
}
loadImageFromNetwork
方法是进行下载的方法,并且与主UI线程完全异步。
作为一个基本示例,您可以修改您的应用程序以便这样调用:
for(int i = 0; i < 100; i++){
new DownloadImageTask().execute("http://www.android.com/image" + i + ".jpg");
}
虽然对于优化,我不会一次抛出100个请求,可能会创建一个Threaded队列系统,允许4或5个并发连接,然后通过保持{{1未决请求的读取。
答案 1 :(得分:0)
无论你怎么做,你最终都会打开多个连接,一个连接来获取每个图像。这就是接收任何图像的方式。而且无论如何都无法改变HttpURLConnection
。从这个意义上看,这看起来很不错。
但是,您可以尝试通过线程同时加载多个图像。实施这样的计划会有些复杂,但完全有可能。它会通过同时请求多个图像来加快这一过程。