我在我的安卓应用程序中使用视图寻呼机来显示在特定时间后自动滚动的图像。
在我的OnCreate中,我像这样定义了寻呼机:
List<String> urls;
urls= new ArrayList<>();
urls.add("http://<myserver>/adrotatecustom1.png");
urls.add("http://<myserver>/adrotatecustom2.jpg");
urls.add("http://<myserver>/adrotatecustom3.jpg");
urls.add("http://<myserver>/adrotatecustom4.jpg");
mImageViewPager.setAdapter(new CustomPagerAdapter(getApplicationContext(), urls));
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabDots);
tabLayout.setupWithViewPager(mImageViewPager, true);
autoSlider(mImageViewPager);
自动滑块方法:
public void autoSlider(final ViewPager viewPager)
{
final Handler handler = new Handler();
final Runnable rr = new Runnable()
{
public void run()
{
int i=0;
int pos = viewPager.getCurrentItem();
if(pos >= i && pos != mImages.length - 1){
i = pos;
i++;
}
else if(pos < (i-1)){
i = pos;
i++;
}
viewPager.setCurrentItem(i, true);
i++;
if (i >= mImages.length)
i = 0;
autoSlider(viewPager);
}};
handler.postDelayed(rr, 15000);
}
用于查看寻呼机的适配器:
public class CustomPagerAdapter extends PagerAdapter {
Context c;
private List<String> _imagePaths;
private LayoutInflater inflater;
public CustomPagerAdapter(Context c, List<String> imagePaths) {
this._imagePaths = imagePaths;
this.c = c;
}
@Override
public int getCount() {
return this._imagePaths.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == (object);
}
@Override
public Object instantiateItem(ViewGroup container,final int position) {
ImageView imgDisplay;
inflater = (LayoutInflater) c
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View viewLayout = inflater.inflate(R.layout.activity_viewpagerlayout, container,
false);
imgDisplay = (ImageView) viewLayout.findViewById(R.id.imgViewpager);
Picasso.with(c).load(_imagePaths.get(position)).into(imgDisplay);
(container).addView(viewLayout);
return viewLayout;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
(container).removeView((LinearLayout) object);
}
}
问题是它最初工作正常,如果我更改服务器中的图像(具有相同名称的不同图像),它仍然引用旧图像,但我在服务器中的任何地方都没有旧图像。谁能帮助我在这里错过什么。
如果我更改服务器中的图像(具有相同名称的不同图像),它仍然引用旧图像
您需要清除缓存Picasso
使用此.memoryPolicy(MemoryPolicy.NO_CACHE)
和.networkpolicy(NetworkPolicy.NO_CACHE)
清除缓存Picasso
法典
Picasso.with(c)
.load(_imagePaths.get(position))
.memoryPolicy(MemoryPolicy.NO_CACHE)
.networkpolicy(NetworkPolicy.NO_CACHE)
.into(imgDisplay);
使用glide库进行图像加载:
Glide.with(holder.itemView.getContext()).load(_imagePaths.get(position)).
diskCacheStrategy(DiskCacheStrategy.RESULT).
placeholder(R.color.off_white).into(holder.imgImage);
Inbuild.gradle
compile 'com.github.bumptech.glide:glide:3.7.0'
如果我更改服务器中的图像(具有相同名称的不同图像),它仍然引用旧图像
ViewPager
在安卓中不刷新
不要对不同的图像使用相同的名称,因为当第一次通过 Lib 加载图像时Picasso
它将存储在内存CASH
如果从服务器端您将更改具有旧同名的图像,Picasso
会预测它是相同的图像并显示或加载旧图像而不是新图像
所以我的建议是:从服务器更新图像时,您应该存储与以前不同的更新图像名称。
如果您仍然想使用相同的名称,您可以使用.memoryPolicy(MemoryPolicy.NO_CACHE)
它将从您的应用程序中使用的所有内存中删除CACHE
Picasso
例
Picasso.with(context)
.load(listView.get(position))
.memoryPolicy(MemoryPolicy.NO_CACHE)
.networkpolicy(NetworkPolicy.NO_CACHE)
.into(imageView);
有关更多信息,官方DOC和memory-cache-piccaso MemoryPolicy类
它显示旧图像,因为在加载图像时URL相同,并且像Picaso/Glide
这样的库首先从cashe加载图像。 因此,如果您想加载新上传的图像,请在URL
中附加timestamp
,然后 ImageLoading 库自动加载新图像。
例如url="http://abc.co/img.jpg?2017-12-31 11:12:13";
在您的情况下,请更新您的所有imagepaths
我使用Glide进行图像加载并使用.diskCacheStrategy(DiskCacheStrategy.NONE)
这是我的方法:
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView imgDisplay;
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View viewLayout = inflater.inflate(R.layout.viewpager_image, container,
false);
imgDisplay = viewLayout.findViewById(R.id.image);
StorageReference storageReference = FirebaseStorage.getInstance().getReferenceFromUrl(_imagePaths.get(position));
Glide.with(context).load(storageReference)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.placeholder(R.drawable.avator)
.error(R.drawable.avator)
.into(imgDisplay);
(container).addView(viewLayout);
return viewLayout;
}