我有一个应用程序,它显示了一个来自android Volley的一个NetworkImageView小部件的片段。
在NetworkImageView中加载的URL处的图像每5秒更改一次,因此我想按下我在操作栏中创建的重新加载按钮来提升此图像。
我发现了两个问题:
如果我再次调用此代码加载Image(在onActivityCreated()方法创建片段时已调用它):
mNetworkImageView = (NetworkImageView) getView().findViewById(R.id.networkImageView);
mImageLoader = VolleySingleton.getInstance(getActivity()).getImageLoader();
mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);
所以不会发生任何事情(这不是该链接的实际IMG),我认为是因为它现在从缓存而不是从互联网加载IMG。
如果我调用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);
:
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的地方。
有人可以解释一下如何纠正这个问题吗?
答案 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方法。