我正在使用两个缓存开发图像加载器。
这是我的逻辑。
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(),但这需要太多时间。
我不知道如何解决它......我错过了什么
谁能帮帮我??