我有一个自定义ListView,可以延迟加载远程图像。单击listitem时,它会启动一个新的Activity并在webview中显示该图像。 问题是,webview总是加载图像,即使图像是由listview适配器预加载的。我希望WebView加载图像仅,如果它没有预加载!
以下是我在listview中预加载图片的方法:
public void DisplayImage(String url, ImageView imageView)
{
imageViews.put(imageView, url);
Bitmap bitmap=memoryCache.get(url);
if(bitmap!=null)
imageView.setImageBitmap(bitmap);
else
{
queuePhoto(url, imageView);
imageView.setImageResource(stub_id);
}
}
延迟加载的图像存储在FileCache:
中public FileCache(Context context){
//Find the dir to save cached images
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"LazyList");
else
cacheDir=context.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
}
public File getFile(String url){
//I identify images by hashcode. Not a perfect solution, good for the demo.
String filename=String.valueOf(url.hashCode());
//Another possible solution (thanks to grantland)
//String filename = URLEncoder.encode(url);
File f = new File(cacheDir, filename);
return f;
}
答案 0 :(得分:1)
处理此问题的正确方法是使用您用于下载图像的客户端/连接安装HttpResponseCache
。虽然直到API级别13才提供平台实现,但有一个适用于Android 1.5及更高版本的backported version。这种缓存机制仅适用于Http(s)URLConnection
;如果您使用HttpClient
,您将需要Apache的HttpClient Caching Module。
如果您正在使用快速解决方案,则可以查看WebViewClient
的{{3}}方法。通过重写该方法,您可以拦截在即将获取资源时触发的请求,包括图像,如果我没有弄错的话。您可以实现执行本地查找的检查以查看是否已下载图像,如果已经下载,则将其包装在WebResourceResponse
中。如果文件不在本地可用,则根本不做任何事情,让客户端处理下载。这样做的缺点是webclient下载的任何内容都无法用于延迟图像加载器。