2012-11-23 161 views
6

在我的应用程序中,我使用下面的代码来下载几个图像。 这样做是否高性能?或者我可以以某种方式重新使用连接吗?重复使用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(); 
      } 
     } 
} 

回答

5

重复使用HttpURLConnection并不会真正获得任何好处。

一两件事,这将大大有利于你的应用程序是,如果你花一些时间寻找到异步任务,这将允许您利用与回调多线程的HTTP请求的力量,你的主代码。

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

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

的谷歌的文章,可以发现在: 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读取结束时其余部分通过。

0

不管你怎么做,你最终会打开多个连接,一个来获取每个图像。这是如何收到任何图像。无论如何,无法改变HttpURLConnection。所以从这个意义上来看,这看起来很好。

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

+2

它在幕后做连接池。 – EJP