2

リモート画像の遅延読み込みを行うカスタムListViewがあります。リストアイテムをクリックすると、新しいアクティビティが開始され、画像がWebビューに表示されます。問題は、画像がリストビューアダプタによってプリロードされている場合でも、Webビューは常に画像をロードすることです。プリロードされていない場合にのみ、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まで提供されていませんでしたが、Android1.5以降で動作するバックポートバージョンがあります。ただし、このキャッシュメカニズムは次の場合にのみ適してHttp(s)URLConnectionいます。使用するHttpClient場合は、ApacheのHttpClientキャッシングモジュールが必要になります。

WebViewClient簡単な解決策が必要な場合は、の方法も確認できる可能性がありますshouldInterceptRequest(...)。そのメソッドをオーバーライドすることで、私が間違っていなければ、画像を含め、リソースがフェッチされようとしているときに発生するリクエストをインターセプトできます。ローカルルックアップを実行するチェックを実装して、イメージが既にダウンロードされているかどうかを確認し、ダウンロードされている場合は、でラップして返すことができますWebResourceResponse。ファイルがローカルで利用できない場合は、何もせずにクライアントにダウンロードを処理させます。これの欠点は、Webクライアントによってダウンロードされたものがレイジーイメージローダーで利用できないことです。

于 2012-05-01T10:11:55.243 に答える