重用HttpURLConnection

时间:2012-11-23 10:32:11

标签: java android http httpurlconnection

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

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

2 个答案:

答案 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。从这个意义上看,这看起来很不错。

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