忍者ブログ

アンドロイドのあれこれ

もう少し便利な、Web上の画像の取得方法&一時キャッシュのとり方
AndroidアプリにインターネットなどでWeb上にある画像を表示させたいとき、タスク管理、データのキャッシュの簡単な例を紹介します。

bitmap型データを一時的にメモリ上で保存する
// ImageCache.java
public class ImageCache {
    private static HashMap<String, Bitmap> cache = new HashMap<String, Bitmap>();
    
    public static Bitmap getImage(String key) {
        if (cache.containsKey(key)) {
            return cache.get(key);
        }
        return null;
    }
    
    public static void setImage(String key, Bitmap image) {
        cache.put(key, image);
    }
    
    public static void clearCache() {
        cache = null;
        cache = new HashMap<String, Bitmap>();
    }
}

AsyncTaskを使ってバックグラウンドで画像を取得する
// ImageGetTask.java
public class ImageGetTask extends AsyncTask<String, Integer, Bitmap> {
    private ImageView mImage;
    private String tag;
    private Context mContext;

    public ImageGetTask(ImageView image, Context context){
        mImage = image;
        tag = image.getTag().toString();
        mContext = context;
    }

    @Override
    protected Bitmap doInBackground(String... params){
        Bitmap img = ImageCache.getImage(params[0]);
        try {
            if (img == null) {
                URL imgUrl = new URL(params[0]);
                img = BitmapFactory.decodeStream(imgUrl.openStream());
                ImageCache.setImage(params[0], img);
            }
            return img;
        } catch(IOException e) {
            return null;
        }
    }
    
    @Override
    protected void onPostExecute(Bitmap result){
        if (tag.equals(mImage.getTag())) {
            if (result != null){
                mImage.setImageBitmap(result);
            } else {
                mImage.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_launcher));
            }
            mImage.setVisibility(View.VISIBLE);
        }
    }
}

実装例
// MainActivity.java
public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        String imgUriStr = "http://3.bp.blogspot.com/-2Trw6XxAZMY/Tt5SOyqUwkI/AAAAAAAAIw8/Pl1v7EdRpCE/s800/graph_only_3.jpg";
        ImageView imgView = (ImageView)findViewById(R.id.imageView);
        imgView.setTag(imgUriStr);
        Bitmap imgBitmap = ImageCache.getImage(imgUriStr);
        if (imgBitmap != null) {
            imgView.setImageBitmap(imgBitmap);
        } else {
            imgView.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher));
            ImageGetTask imgTask = new ImageGetTask(imgView, this);
            imgTask.execute(imgUriStr);
        }
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        ImageCache.clearCache();
    }
}
COMMENT
NAME
TITLE
MAIL (非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS (コメント編集に必須です)
SECRET
管理人のみ閲覧できます
 
PR
© Android Advent
powered by 忍者ツールズ / 忍者ブログ / [PR]