如何重新加载 NetworkImageView

How to reload NetworkImageView

我有一个应用程序正在显示带有来自 android Volley 的一个 NetworkImageView 小部件的片段。

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

我发现了 2 个问题:

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

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

所以什么都不会发生(它不是 link 的实际 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);
    

来自 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);
}

应用程序在单击操作栏重新加载按钮后出现 NullPointerException 错误。

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

谁能解释一下如何解决这个问题?

首先从request queue得到cache

然后通过从缓存中调用 remove 函数从 cache 中删除您的 URL(关键是您的 url)。

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

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

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

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

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

因此我的解决方案是制作自定义缓存 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 方法。