在webview中显示预加载的位图

时间:2012-05-01 09:27:00

标签: android webview bitmap

我有一个自定义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;

}

1 个答案:

答案 0 :(得分:1)

处理此问题的正确方法是使用您用于下载图像的客户端/连接安装HttpResponseCache。虽然直到API级别13才提供平台实现,但有一个适用于Android 1.5及更高版本的backported version。这种缓存机制仅适用于Http(s)URLConnection;如果您使用HttpClient,您将需要Apache的HttpClient Caching Module

如果您正在使用快速解决方案,则可以查看WebViewClient的{​​{3}}方法。通过重写该方法,您可以拦截在即将获取资源时触发的请求,包括图像,如果我没有弄错的话。您可以实现执行本地查找的检查以查看是否已下载图像,如果已经下载,则将其包装在WebResourceResponse中。如果文件不在本地可用,则根本不做任何事情,让客户端处理下载。这样做的缺点是webclient下载的任何内容都无法用于延迟图像加载器。