我正在使用两个缓存开发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(),但这需要太多时间。
我不知道如何修复它......以及我缺少的东西
任何人都可以帮助我吗?