如何同时使用DiskLruCache(DiskCache)和LruCache(MemoryCache)?

时间:2018-04-12 15:49:51

标签: android caching memorycache diskcache

我正在使用两个缓存开发Image Loader。

这是我的逻辑。

1,开始获取磁盘缓存上的图像(当应用程序启动时)

2,检查内存缓存。如果是,则从Cache内存加载。

3,如果内存缓存中不存在该映像,请检查磁盘缓存。然后将图像放入memorycache。

第4,如果图像既没有内存缓存也没有磁盘缓存,请使用asynctask从url创建位图。然后把磁盘缓存。

,这是我的来源。

1,App的onCreate()

    protected void onCreate(Bundle savedInstanceState) {
    ...
        if (workerTask == null) {
            workerTask = new BitmapWorkerTask();
            workerTask.execute(imgUrls);
        }
    ...
    }

类BitmapWorkerTask扩展了AsyncTask,Void,Bitmap> {

@Override
protected Bitmap doInBackground(ArrayList<String>... params) {
    ArrayList<String> imgUrls = params[0];
    Bitmap bitmap = null;

    for (int i = 0; i < imgUrls.size(); i++) {
        String key = imgUrls.get(i);
        if (MainActivity.getBitmapFromDiskCache(key) == null) {
            URLConnection urlConnection = null;
            try {
                urlConnection = (HttpURLConnection) new URL(key).openConnection();
                urlConnection.setDoInput(true);
                urlConnection.connect();
                urlConnection.setConnectTimeout(3000);
                urlConnection.setReadTimeout(3000);
                InputStream input = urlConnection.getInputStream();
                bitmap = BitmapFactory.decodeStream(input);
            }catch (Exception e){
                e.printStackTrace();
            }
            MainActivity.addBitmapToDiskCache(key, bitmap);
        }
    }
    return bitmap;
}

第2到第4,getView

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
...
 if (MainActivity.getBitmapFromMemCache(imgUrl) != null) {
        bitmap = MainActivity.getBitmapFromMemCache(imgUrl);
        Log.d("Service", "getBitmapFromMemCache");
    } else {
        if (MainActivity.getBitmapFromDiskCache(imgUrl) != null) {
            bitmap = MainActivity.getBitmapFromDiskCache(imgUrl);
            MainActivity.addBitmapToMemoryCache(imgUrl, bitmap);
        } else {
            ArrayList<String> arrayList = new ArrayList<>();
            arrayList.add(imgUrl);
            BitmapWorkerTask task = new BitmapWorkerTask();
            task.execute(arrayList);
        }
    }
...
}

问题是'当两个缓存中都没有数据时'。我认为如果该源是正确的,当缓存中没有数据时,必须在task.execute(arrayList)之后将图像放入磁盘缓存中。但它不是......

所以,我尝试更改task.execute(arrayList).get(),但这需要太多时间。

我不知道如何修复它......以及我缺少的东西

任何人都可以帮助我吗?

0 个答案:

没有答案