2016-06-23 6 views
0

WebServicesでVolley APIを使用しています。その後、SQLiteでデータを書きます。android - 画像をキャッシュしてオフラインで表示するにはどうすればよいですか?

多くのitensを持つJSONが付属しているWebサービスには、それぞれデータとイメージがあり、このイメージをキャッシュに保存して、ListViewおよび後で詳細画面に表示する必要があります。将来、ユーザーはこれらの画像を消去し、それらの画像も消去します。

これらの画像をローカルDBに保存し、JSONの各アイテムとリンクするにはどうすればよいですか?

時間の90%でオフラインになります。私は更新されたサーバー項目を同期してダウンロードするためだけにオンラインに留まります。

+0

として画像を取得します。これらのライブラリは画像のキャッシュを自動的に管理し、非常にカスタマイズ可能です – crgarridos

+0

ピカソについて聞いたことがありますが、ピカソがオフラインで画像を表示できるかどうかはわかりません。 – LMaker

+0

実際に両方ともできます。あなたはあなたの画像を一度読み込み、ライブラリはすべて内部的に管理します。設定なしのピカソ、アプリクラスの最初の初期化を伴うUIL – crgarridos

答えて

1

アンドロイドの画像でベンチマークを扱うためPicassoライブラリを使用することです。それはの世話を:アダプターでImageViewのリサイクルとダウンロードキャンセルの取り扱い

  • メモリを最小限に抑えた複雑な画像変換。
  • 自動メモリとディスクキャッシュ。そのほかに

あなたがリストに画像を表示し、あなたのUIを強化するために、アニメーションを必要とするつもりなら、私は強くRecyclerViewにListViewコントロールから変更することをお勧めします。 DBに画像を保存することはお勧めしません。ブロブからの変換に時間がかかりません(チェックherehere)。私が示唆していることは次のとおりです。

  1. JSONで提供されているURLから画像を読み込むにはPicassoを使用してください。
  2. Picassoがダウンロードした画像ファイルを処理するカスタムターゲットを実装します。
  3. イメージをアプリディレクトリ内のフォルダに保存します。
  4. RecyclerViewを使用してイメージを表示します。 (オプション)

これらのことが行われたプロジェクトの例が必要な場合は、thisをチェックすることができます。このプロジェクトで私は上記のアプローチに従います。あなたは店からアプリをダウンロードして、どのように画像をダウンロードするかを見ることができます。

Quickyガイド:

  1. ピカソがあなたにモジュールのGradleのファイルにこれを追加使用するには:import com.squareup.picasso.Callback;を実装するクラスを作成しますcompile 'com.squareup.picasso:picasso:2.5.2'

  2. を:

    パブリッククラスImageWarehouseは、コールバック{ を実装プライベート静的最終文字列TAG = "ImageWarehouse";あなたがであなたのイメージを保存することができます

    Picasso .load(URL) .fit() .centerCrop() .into(viewHolder.cover, new ImageWarehouse( name, viewHolder.cover, Constants.MEDIA_CHARACTER ) );

+2

あなたは私を救ってくれてありがとう!素晴らしい説明をありがとう – LMaker

1

あなたはAndroid-Universal-Image-Loaderを使用することもできます。これはメモリ内のキャッシュイメージです。次に画像を取得するためにimageloaderで使用された同じURLをキャッシュから表示する

ユニバーサルイメージローダーの例の完全なソースコードについては、下のリンクを参照してください。

Android - Universal Image Loader

0

:レイアウトの画像を表示し、指定したパスに保存するために

private String mDirectory; 
private String mFileName; 
private ImageView mContainer; 
@Inject 
App mApplication; 

public ImageWarehouse(String fileName, ImageView container, String directory) { 
    this.mFileName = fileName; 
    this.mContainer = container; 
    this.mDirectory = directory; 
    this.getStorageDir(); 
} 

@Override 
public void onSuccess() { 
    if (this.isExternalStorageWritable()) { 
     final Bitmap bitmap = ((BitmapDrawable) this.mContainer.getDrawable()).getBitmap(); 
     new AsyncTask<Void, Void, File>() { 
      @Override 
      protected File doInBackground(Void... params) { 
       File file = null; 
       try { 
        file = new File(ImageWarehouse.this.getStorageDir().getPath().concat("/").concat(ImageWarehouse.this.mFileName.concat(Constants.MEDIA_EXTENSION))); 
        file.createNewFile(); 
        FileOutputStream ostream = new FileOutputStream(file); 
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, ostream); 
        ostream.close(); 
       } catch (Exception e) { 
        Log.e(TAG, "External Storage is not available"); 
       } 
       return file; 
      } 
     }.execute(); 
    } else { 
     Log.e(TAG, "External Storage is not available"); 
    } 
} 

@Override 
public void onError() { 

} 

public boolean isExternalStorageWritable() { 
    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state)) { 
     return true; 
    } 
    return false; 
} 

public File getStorageDir() { 
    File file = new File(Environment.getExternalStorageDirectory(), Constants.MEDIA_DIRECTORY.concat(this.mDirectory)); 
    if (!file.mkdirs()) { 
    } 
    return file; 
} 

}

  • コールピカソSqliteをblobとして取得し、必要に応じて取得することができます。

    create table sometable(id integer primary key autoincrement,photo BLOB); 
    

    としてテーブルを作成し、

    //convert image into byte[] 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    Bitmap bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.common)).getBitmap(); 
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); 
    byte[] photo = baos.toByteArray(); 
    
    //And now store this image 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put("photo",photo); 
    return db.insert("sometable", null, initialValues); 
    

    として画像を保存して、ユニバーサルイメージローダーやピカソを使用することができます

    Cursor cur=your query; 
    while(cur.moveToNext()) 
    { 
        byte[] photo=cur.getBlob(index of blob cloumn); 
    } 
    
  • 関連する問題