2

listView とアダプター
があり、リストの中央までスクロールしました (100 個のアイテムがある場合、アイテム #50 にいるとします)
そこに着いたら、サーバーからいくつかの更新を取得します..たとえば、新しいようにFacebook からのストーリー..
A. notifyDataSetChanged() を呼び出して位置を維持したい - そのためにB.ボレー ライブラリから 素敵なNetworkImageViewを使用しています。 (そしておそらくそれが私の問題の原因です)、現時点では、画像をリロードするとユーザーに何らかのちらつきが発生します(写真が読み込まれていない)this code

編集:

    mQueue = Volley.newRequestQueue(getApplicationContext());// thread pool(4)
    mngr.setRequestQueue(mQueue);

    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
    mImageLoader = new ImageLoader(mQueue, new ImageCache() {

        private final LruBitmapCache mCache = new LruBitmapCache(maxMemory);

        public void putBitmap(String url, Bitmap bitmap) {

            mCache.put(url, bitmap);
        }

        public Bitmap getBitmap(String url) {

            return mCache.get(url);

        }
    });

私の解決策:

//      final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
    mImageLoader = new ImageLoader(mQueue, new ImageCache() {

        private final BitmapLruCache mCache = new BitmapLruCache();

        public void putBitmap(String url, Bitmap bitmap) {

            mCache.put(url, bitmap);
        }

        public Bitmap getBitmap(String url) {

            return mCache.get(url);

        }
    });

次の bimtap lru キャッシュ実装を使用しました

public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageCache {
public static int ONE_KILOBYTE = 1024;

public BitmapLruCache() {
    this(getDefaultLruCacheSize());
}

public BitmapLruCache(int maxSize) {
    super(maxSize);
}

public static int getDefaultLruCacheSize() {
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / ONE_KILOBYTE);
    final int cacheSize = maxMemory / 8;

    return cacheSize;
}

@Override
protected int sizeOf(String key, Bitmap value) {
    return value.getRowBytes() * value.getHeight() / ONE_KILOBYTE;
}

@Override
public Bitmap getBitmap(String url) {
    return get(url);
}

@Override
public void putBitmap(String url, Bitmap bitmap) {
    put(url, bitmap);
}
}

皆さんはどう思いますか?

10倍

4

1 に答える 1

0

私はvolleyライブラリの素敵なNetworkImageViewを使用しています.notifyDataSetChangedが呼び出されたときに、現在のように画像がリロードされないことを望んでいます.(そしておそらくそれが私の問題の原因です) 、画像をリロードすると、ユーザーに何らかのちらつきが発生します(写真が読み込まれていません)

ImageLoader にメモリ内キャッシュを提供しましたか? を呼び出すと.setImageUrl、Volley はまず ImageLoader をインスタンス化するときに指定したキャッシュからイメージを取得しようとし、次にディスク キャッシュ (Volley に組み込まれている) に移動し、次にネットワークに移動します。メモリ キャッシュを適切に使用した場合、.setImageUrlちらつきなく即座に戻るはずです。私の推測では、ディスク キャッシュを使用したと思われます (残念ながら、一部のチュートリアルでは推奨されています)。

メモリ キャッシュの例は、たとえばここにあります: https://github.com/ogrebgr/android_volley_examples/blob/master/src/com/github/volley_examples/toolbox/BitmapLruCache.java次に、次のように ImageLoader をインスタンス化します。

int cacheSize = 1024 * 1024 * 10; // 10MB Cache
mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache(cacheSize));
于 2013-09-17T15:55:44.020 に答える