2017-02-22 7 views
0

私はVolleyのイメージキャッシングを理解しようとしています。私は、サーバーからイメージをロードするネットワークイメージビューの断片を持っています。 NetworkImageViewを使用してイメージを表示できません。イメージをロードしようとすると何も表示されません。私はバレーが自動的にイメージキャッシングを行うことを読んでいます。しかし、私は、サーバーからイメージを読み込むための適切な方法を使用していない可能性があります。私は私のフラグメントでネットワーク画像ビューを初期化したVolley Image Cahing

バレーボールシングルトンクラス

public class Volley { 
    private static Volley mInstance; 
    private static Context mContext; 

    private RequestQueue mRequestQueue; 
    private ImageLoader mImageLoader; 

    private Volley(Context context) { 
     mContext = context; 
     mRequestQueue = getRequestQueue(); 
     ImageLoader.ImageCache imageCache = new BitmapLruCache(); 
//  ImageLoader imageLoader = new ImageLoader(Volley.newRequestQueue(context), imageCache); 
     mImageLoader = new ImageLoader(mRequestQueue, 
       new ImageLoader.ImageCache() { 
        private final LruCache<String, Bitmap> 
          cache = new LruCache<String, Bitmap>(20); 

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

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

    public static synchronized Volley getInstance(Context context) { 
     if (mInstance == null) { 
      mInstance = new Volley(context); 
     } 

     return mInstance; 
    } 

    public RequestQueue getRequestQueue() { 
     if (mRequestQueue == null) { 
      // getApplicationContext() is key, it keeps you from leaking the 
      // Activity or BroadcastReceiver if someone passes one in. 
      mRequestQueue = com.android.volley.toolbox.Volley.newRequestQueue(mContext.getApplicationContext()); 
     } 

     return mRequestQueue; 
    } 

    public <T> void addToRequestQueue(Request<T> req) { 
     getRequestQueue().add(req); 
    } 

    public ImageLoader getImageLoader() { 
     return mImageLoader; 
    } 
} 

以下

が私のコードである

 String url = "https://pixabay.com/en/youtube-laptop-notebook-online-1158693/"; 
     mImageView = ((NetworkImageView) mView.findViewById(R.id.imageView)); 
     ImageLoader imageLoader = Volley.getInstance(mContext).getImageLoader(); 
     mImageView.setImageUrl(url, imageLoader); 

LruCacheクラス

public class BitmapLruCache extends LruCache<String, Bitmap> 
     implements ImageLoader.ImageCache { 
    public BitmapLruCache() { 
     this(getDefaultLruCacheSize()); 
    } 

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

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

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

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

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

     return cacheSize; 
    } 
} 

I h aveは記事や公式のGoogleドキュメントをたくさん読んでいますが、私の場合はどのように動作するのか分かりません。事前

+0

'imageLoader.get()'呼び出しがありません。 – Abbas

+0

指定できますか? –

+1

PicassoやFrescoなどの既存のイメージ読み込みとキャッシュライブラリを使用することを強くお勧めします。積極的に維持管理され、最適化されたものを使用するオプションがあるときには、これらのことを自分で実装することは重要ではありません。また、いくつかのコード行で同じことを行います。 – Juuso

答えて

1

ありがとうございますImageLoaderためのget呼び出しが欠落しています。また、レスポンスコールバックでイメージを設定することもできます。

imageLoader.get(url, new ImageLoader.ImageListener() { 
    @Override 
    public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { 
     mImageView.setImage(response.getBitmap()); 
    } 

    @Override 
    public void onErrorResponse(VolleyError error) { 

    } 
}); 

コンパイラでコードをチェックしていないため、コードにエラーがある可能性があります。 @Juuso LappalainenのコメントPicassoは、画像のロードと自動キャッシュのための非常に素晴らしいライブラリです。ここでは、キャッシュのサイズを指定するだけです。画像の読み込みを1行に簡素化することができます。

+0

ありがとうございます。それは今働いている。 –

+1

StackOverflowがどのように動作するか教えてください:誰かが質問をしたときに、1つの回答を受け入れたものとしてマークします(つまり、回答が解決したことを意味します)。答えが好きで、その答えを告げる。だから私の答えがあなたの問題を解決したら、それを合格とマークしてください。 – Abbas