先日マンガ管理のアップデートを公開しました。
アプリの中では画像検索の際に毎回画像をダウンロードすると、通信量が多くなるのと、時間がかかるため、本体のキャッシュ領域に一時保存しています。
そのキャッシュの部分のメモです。

キャッシュの部分


DiscCache.java
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class DiscCache {
    private File dir;
    private Bitmap bitmap;

    DiscCache(Context context){
        dir = new File(context.getCacheDir().getPath());
        if(!dir.exists()){
            dir.mkdir();
        }
    }

    public void save(String url, Bitmap bitmap){
        try {
            FileOutputStream os = new FileOutputStream(new File(createFilePath(dir, getKey(url))));
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
        }catch (FileNotFoundException e){
        }
    }

    public Bitmap getCache(String url){
        if(new File(createFilePath(dir,getKey(url))).exists()){
            bitmap = BitmapFactory.decodeFile(createFilePath(dir, getKey(url)));
            return bitmap;
        }else{
            return null;
        }
    }

    public void clear(){
        clearFiles(dir.listFiles());
    }

    private void clearFiles(File[] files){
        for (File file : files) {
            if (file.isFile()) {
                file.delete();
            } else if (file.isDirectory()) {
                clearFiles(file.listFiles());
            }
        }
    }

    private String getKey(String str){
        return String.valueOf(Math.abs(str.hashCode()));
    }

    private String createFilePath(File dir, String key){
        return dir.getAbsolutePath() + File.separator + key;
    }
}


URLそのままでファイル名を付けずに変換し、ここではPNG形式で保存しています。

使用例


Downloader.java
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.view.View;
import android.widget.ImageView;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

public class Downloader extends AsyncTask {
    private String imageURL;
    private Context context;
    private ImageView imageView;

    Downloader(String imageURL,Context context, ImageView imageView){
        this.imageURL = imageURL;
        this.context = context;
        this.imageView = imageView;
    }

    @Override
    protected Bitmap doInBackground(Void... params) {
        DiscCache cache = new DiscCache(context);
        Bitmap bitmap = cache.getCache(imageURL);
        if(bitmap == null) {
            try {
                bitmap = getImage();
                cache.save(imageURL, bitmap);
            } catch (IOException e) {
                bitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher);
            }
        }
        return bitmap;
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        imageView.setImageBitmap(result);
    }

    private Bitmap getImage() throws IOException{
        URL url = new URL(imageURL);
        InputStream is = url.openConnection().getInputStream();

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.ARGB_4444;
        options.inPurgeable = true;

        Bitmap bitmap = BitmapFactory.decodeStream(is, null, options);
        is.close();
        return bitmap;
    }
}


コンストラクタにいろいろ詰め込んでいるのは気にしないでください。
以前に保存したキャッシュがあればそちらのBitmapを、なければダウンロードしキャッシュに保存しています。
あまりややこしくないと思います。

キャッシュの削除は.clear()を呼べばキャッシュ以下のファイルはすべて削除されます。