2

我有一个自定义 ListView 可以延迟加载远程图像。当您单击一个列表项时,它会启动一个新 Activity 并在 web 视图中显示图像。问题是,webview 总是加载图像,即使图像是由 listview 适配器预加载的。我希望 WebView仅在未预加载时才加载图像!

这是我在列表视图中预加载图像的方法:

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;

}
4

1 回答 1

1

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

如果您正在寻求快速解决方案,您还可以查看WebViewClient'sshouldInterceptRequest(...)方法。通过覆盖该方法,如果我没记错的话,您可以拦截在即将获取资源(包括图像)时触发的请求。您可以执行一个检查,执行本地查找以查看图像是否已经下载,如果是,则将其返回包装在WebResourceResponse. 如果文件在本地不可用,只需不做任何事情,让客户端处理下载。这样做的缺点是 webclient 下载的任何内容都不能用于惰性图像加载器。

于 2012-05-01T10:11:55.243 回答