7

在我的应用程序中,我使用如下代码下载多个图像。这样做是高性能还是我可以以某种方式重用连接?

   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();
           }
         }
}
4

2 回答 2

5

您不会真正从重用HttpURLConnection.

对您的应用程序大有裨益的一件事是,如果您花一些时间研究Async Tasks,这将允许您利用多线程 HTTP 请求的强大功能以及对主代码的回调。

请参阅: http : //www.vogella.com/articles/AndroidPerformance/article.html,了解如何使用异步任务的一个很好的示例。

一个很好的起点当然是Android Developers Blog,他们有一个从服务器异步下载图像的示例,这将很好地满足您的要求。通过一些调整,您可以让您的应用程序一次发送多个异步请求以获得良好的性能。

可以在以下位置找到 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 个请求,可能会创建一个线程队列系统,它可能允许 4 或 5 个并发连接,然后通过维护一个ArrayList待读取的请求来保持其余连接通过,当另一个连接完成时.

于 2012-11-23T10:49:52.687 回答
0

不管你怎么做,你最终都会打开多个连接,一个来获取每个图像。这就是接收任何图像的方式。而且无论如何都没有办法改变HttpURLConnection。所以从这个意义上说,这看起来不错。

但是,您可以尝试通过线程同时加载多个图像。实施这样的方案会有些复杂,但完全有可能。它将通过同时请求多个图像来加速该过程。

于 2012-11-23T10:35:58.553 回答