2016-07-14 10 views
2

私のアプリでは、AWSバケットからイメージをダウンロードするAysnceTaskを繰り返しますが、ダウンロードに少し時間がかかります(通常は1/2秒)、10枚のイメージをダウンロードするとユーザー体験を悪化させます。イメージをより速くより効率的にダウンロード

私の質問です:AWS S3から画像を高速にダウンロードする方法はありますか?

のAndroidコード:さまざまなサービスを使用して

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 

    protected Bitmap doInBackground(String... urls) { 

     String PhotoURL = "https://s3.amazonaws.com/bucket/Images/" + productForImages; 
     Bitmap mIcon11 = null; 
     try { 
      InputStream in = new java.net.URL(PhotoURL).openStream(); 
      mIcon11 = BitmapFactory.decodeStream(in); 
     } catch (Exception e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 

     return mIcon11; 
    } 

    protected void onPostExecute(Bitmap result) { 

     productColumn = 5; 
     productImages[productRow][productColumn] = result; 

    } 
} 

(AWSのような)、GitHubの、またはダウンロードをスピードアップするために別のライブラリが可能です!

+1

Picasso - > http://square.github.io/picasso/を使用すると、キャッシュオプションとビューへのバックグラウンドの読み込みが行われます。また、あなたのダウンロード速度はあなたのネットワークに依存しますが、ピカソはあなたのためにパラレルダウンロードを行います –

+0

これを答えに入れて、私はあなたにアップヴォートを与えることができます、私はグライドを使用しましたが、ピカソで終わったので、 –

答えて

2

使用Picasso - その

ステップ1でライブラリを使用して簡単:Gradleの

compile 'com.squareup.picasso:picasso:2.5.2' 

ステップに依存関係を追加します。 2:活動での使用

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView); 

ピカソはバックグラウンドで重い荷物を扱います。また、イメージをキャッシュして、将来のイメージ検索を高速化します。また、Picassoはデフォルトで並列ダウンロードを行います。

+0

@Lazar Kうれしい! –

+0

グライドのように、ピカソはさらに良く機能します。ありがとうございました! –

0

イメージをより高速かつ効率的にダウンロードしたい場合、ファイルをダウンロードする複数の接続のような方法があります(ただし、小さなファイルではオーバーヘッドが大きすぎます)。

しかし、主要なボトルネックはユーザーのインターネット帯域幅です。現在の実装では、アプリを開くたびにそれらのイメージをダウンロードしているようです。これは効率的ではありません。あなたができることは、画像をキャッシュして更新をチェックすることです。例えば

、アプリを開く:

  • は、画像の更新のためにキャッシュされたimages`(それが新規インストールの場合は、また、アプリのパッケージ内にキャッシュされた画像があるはずです)
  • チェックをロードしますバックグラウンドで
  • 更新がある場合は、
  • ダウンロードが完了したら、キャッシュを更新し、必要に応じて読み込まれたイメージを置き換えます。
2

グライドグッドが推奨するライブラリ。

Picassoライブラリに比べて多くの機能があります。

次のコードに

Glide.with(context) 
.load("//inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg") 
.into(yourImageView); 

参考使ってイメージをロードし、あなたのGradle

compile 'com.github.bumptech.glide:glide:3.5.2' 

でこの依存関係を追加 - https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en

+1

この画像は200倍高速で読み込むだけでなく、アプリで完璧に動作します。 1+ <3 –

+0

@LazarKピカソではGlide以上の利点はありますか? –

+0

私のアプリの背景色は純粋な白で、Glideを使用した場合、画像ビューに灰色の背景が少し追加されて見苦しくなりました。私がS3サーバ上のファイルを更新した場合は、Glideとは異なり、電話で更新されます。 –

0
  1. 使用マルチスレッドダウンロード:あなたはAsynctaskの実行を行うことができますmyTask.execute(AsyncTask.THREAD_POOL_EXECUTOR)と並行してこれにより、同じ時間により多くのダウンロードが可能になります。

  2. サーバーのコンテンツ配信を高速化:Amazonクラウドフロント(CDN)をS3の前に追加します。これにより、ユーザーのダウンロード速度が向上します。

  3. ファイルをディスクキャッシュにダウンロードしてから、必要な解像度のビットマップにデコードします。フルサイズで画像を表示する必要がない場合は、多くのRAMを節約できます。イメージはキャッシュされるため、同じイメージに対する繰り返し要求はネットワークリソースを使用しません。

#1と#3の場合は、単に使用Fresco

+0

元のファイルをダウンロードするとネットワーク帯域幅をどのように節約できますか? – EJP