如何重新加载NetworkImageView

时间:2015-02-28 18:55:40

标签: android android-fragments android-actionbar reload networkimageview

我有一个应用程序,它显示了一个来自android Volley的一个NetworkImageView小部件的片段。

在NetworkImageView中加载的URL处的图像每5秒更改一次,因此我想按下我在操作栏中创建的重新加载按钮来提升此图像。

我发现了两个问题:

  1. 如果我再次调用此代码加载Image(在onActivityCreated()方法创建片段时已调用它):

    mNetworkImageView = (NetworkImageView) getView().findViewById(R.id.networkImageView);
    mImageLoader = VolleySingleton.getInstance(getActivity()).getImageLoader();
    mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);
    
  2. 所以不会发生任何事情(这不是该链接的实际IMG),我认为是因为它现在从缓存而不是从互联网加载IMG。

    1. 如果我调用fragment reload()方法:

      public void reload(){
      
      MainActivity activity = (MainActivity) getActivity();
      IMAGE_URL = activity.getMyData();
      
      mNetworkImageView = (NetworkImageView) getView().findViewById(R.id.networkImageView);
      
      mImageLoader = VolleySingleton.getInstance(getActivity()).getImageLoader();
      
      mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);
      
    2. 来自MainActivity的

      public boolean onOptionsItemSelected(MenuItem item) {        
          int id = item.getItemId();
      
          if (id == R.id.action_settings) {
              return true;
          }
      
          if (id == R.id.action_reload) {
              ViewFragment fragment = new ViewFragment();
              fragment.reload();
          }
      
          return super.onOptionsItemSelected(item);
      }
      
      单击操作栏重新加载按钮后,

      app获取NullPointerException错误。

      reload(); method是我想重新加载NetworkImageView的地方。

      有人可以解释一下如何纠正这个问题吗?

2 个答案:

答案 0 :(得分:1)

首先从cache获取request queue

然后通过从缓存中调用URL函数(密钥是您的网址)从cache中删除remove

然后使用您的第一种方法:

mNetworkImageView = (NetworkImageView) getView().findViewById(R.id.networkImageView);
mImageLoader = VolleySingleton.getInstance(getActivity()).getImageLoader();
mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);

答案 1 :(得分:1)

这个问题和答案看起来很旧,但这些答案对我的项目不起作用。

为了你的帮助,我在这里写了我的解决方案。

问题是Volley的NetworkImageView将图像缓存为地图,并且没有用于初始化缓存地图的API。

因此我的解决方案是make custom cache class,包括removeCacheAll()。

public class ImageCacheTrunk implements ImageLoader.ImageCache {

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

    }

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

    public void removeCacheAll() {
        mCache.evictAll();
    }
}

并在需要重新加载之前调用removeCacheAll方法。