【问题标题】:How to reload NetworkImageView如何重新加载 NetworkImageView
【发布时间】:2015-05-01 08:58:23
【问题描述】:

我有一个应用程序正在显示带有来自 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);
    

所以什么都不会发生(它不是该链接的实际 IMG),我认为这是因为它现在是从缓存而不是从互联网加载 IMG。

  1. 如果我调用片段 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 的地方。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    因此我的解决方案是制作包含 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 方法。

    【讨论】:

      【解决方案2】:

      首先从request queue 获取cache

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

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

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

      【讨论】:

      • 你的意思是这样的吗? : AppController.getInstance().getRequestQueue().getCache().remove(IMAGE_URL);
      • 你能帮我从操作栏调用我的重载方法吗?因为现在我只能在 onActivityCreated 方法的片段中使用它,例如:单击操作栏重新加载时我重新加载整个片段并在 onActivityCreated(of 片段) 我加载 NetworkImageView 然后重置缓存并再次加载 NetworkImageView 但它仍然没有从下载新的 IMG互联网。
      • 否 :-) 因为我无法理解你在做什么以及你将要做什么?这些行是什么 ViewFragment fragment = new ViewFragment();fragment.Call();。你只是实例化了一个片段,你还没有将它添加到你的活动中。你只需创建一个片段并调用调用。
      • 片段被添加到另一部分代码的活动中。和呼叫();方法是我想要重新加载该 NetworkImageView 的代码的地方。据我所知,从活动中调用片段方法的唯一方法就是这样做。 ...我在主题上写错了,现在已编辑。
      • 如果片段已经添加到主活动中,您必须使用从主活动中获取片段管理器并找到您添加的片段。这意味着您必须添加带有标签的片段并通过该标签找到它。然后您可以访问具有正确数据的那个。您所做的只是再次创建片段而不将其添加到您的活动中。
      猜你喜欢
      • 2013-09-22
      • 2011-04-30
      • 2012-09-05
      • 2013-12-05
      • 2014-01-04
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多