0

我正在使用两个缓存开发图像加载器。

这是我的逻辑。

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

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

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

4,如果内存缓存和磁盘缓存都没有图像,则使用asynctask从url制作位图。然后把磁盘缓存。

这是我的来源。

一、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(),但这需要太多时间。

我不知道如何解决它......我错过了什么

谁能帮帮我??

4

0 回答 0