2017-02-22 34 views
0

Я пытаюсь понять кэширование изображений Volley. У меня есть фрагмент с представлением сетевого изображения, который загрузит изображение с сервера. Я не могу отображать изображение с помощью NetworkImageView, когда пытаюсь загрузить изображение, ничего не отображается. Я читаю, что Volley автоматически заботится о Image Caching. Но я думаю, что я не могу использовать правильный способ загрузки изображения с сервера.Volley Image Cahing

Ниже мой код:

Volley Singleton Класс

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 час ave прочитал много статей и официальную документацию Google, но я не понимаю, как это будет работать в моем случае.

Заранее спасибо

+0

Вам не хватает 'imageLoader.get()' call. – Abbas

+0

Можете ли вы указать? –

+1

Я бы очень рекомендовал использовать существующую библиотеку загрузки и кеширования изображений, такую ​​как Picasso или Fresco. Нет никакого смысла в реализации этих вещей самостоятельно, когда у вас есть возможность использовать что-то, что активно поддерживается и оптимизировано, и делает то же самое в нескольких строках кода. – Juuso

ответ

1

Вы не хватает ПОЛУЧИТЬ вызова для ImageLoader. Вы также можете захотеть установить изображение в обратном вызове.

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 - очень хорошая библиотека для загрузки изображений и автоматического кэширования, где вам нужно указать размер кеша. И загрузка изображения может быть упрощена до одной строки.

+0

Спасибо. Он работает сейчас. –

+1

Позвольте мне рассказать вам, как работает StackOverflow: когда кто-то задает вопрос, они также отмечают один ответ как принятый (что означает, что ответ разрешил проблему). Если вам нравится ответ и думаю, что он содержит полную, краткую и хорошо заявленную информацию, тогда Up -Вотьте, что ответ. Поэтому, если мой ответ решит вашу проблему, пожалуйста, отметьте ее как принятую. – Abbas

 Смежные вопросы

  • Нет связанных вопросов^_^