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

アプリケーションに大きなメリットをもたらすことの 1 つは、 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

どのように行っても、各画像を取得するために 1 つずつ、複数の接続を開くことになります。これは、どの画像も受信する方法です。HttpURLConnectionとにかく変更する方法はありません。そういう意味ではいいかもしれませんね。

ただし、スレッドを使用して同時に複数の画像を読み込もうとする可能性があります。このようなスキームを実装するのはやや複雑ですが、完全に可能です。同時に複数の画像をリクエストすることで、プロセスを高速化します。

于 2012-11-23T10:35:58.553 に答える