Android PagerAdapter在第一次转换时变慢
我有一个ViewPager和一个PagerAdapter,它可以从远程服务器下载一些图像(通过它们的id)并显示它们。它几乎可以完美地工作,除了从第一个页面滑动到第二个页面时有点慢(比如1秒),而之后的所有其他转换都是正常的。这不是一个网络问题,因为即使我在刷卡之前等待了很长时间,问题仍然存在。 你知道为什么会这样吗 这是我的密码:Android PagerAdapter在第一次转换时变慢,android,android-viewpager,Android,Android Viewpager,我有一个ViewPager和一个PagerAdapter,它可以从远程服务器下载一些图像(通过它们的id)并显示它们。它几乎可以完美地工作,除了从第一个页面滑动到第二个页面时有点慢(比如1秒),而之后的所有其他转换都是正常的。这不是一个网络问题,因为即使我在刷卡之前等待了很长时间,问题仍然存在。 你知道为什么会这样吗 这是我的密码: public class SliderAdapter extends PagerAdapter{ private SliderActivity activity;
public class SliderAdapter extends PagerAdapter{
private SliderActivity activity;
private long[] imageIds;
private LayoutInflater inflater;
private List<Bitmap> images = new ArrayList<Bitmap>();
public SliderAdapter(Activity activity,
long[] imageIds) {
this.activity = (SliderActivity) activity;
this.imageIds = imageIds;
for (int i=0; i<imageIds.length; i++){
new GetImageTask(imageIds[i]).execute();
}
}
@Override
public int getCount() {
return imageIds.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((View) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView imgDisplay;
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View viewLayout = inflater.inflate(R.layout.layout_fullscreen_image, container,
false);
imgDisplay = (ImageView) viewLayout.findViewById(R.id.imgDisplay);
if (images.size()-1 >= position && images.get(position) != null)
imgDisplay.setImageBitmap(images.get(position));
((ViewPager) container).addView(viewLayout);
return viewLayout;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView((RelativeLayout) object);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
private class GetImageTask extends AsyncTask<Void, Void, Bitmap> {
private final String LOG_TAG = GetImageTask.class.getName();
private Long id;
public GetImageTask(Long id) {
super();
this.id = id;
}
@Override
protected Bitmap doInBackground(Void... params) {
//Download image code
}
@Override
protected void onPostExecute(Bitmap imgBmp) {
if (imgBmp!=null) {
images.add(imgBmp);
activity.adapter.notifyDataSetChanged();
}
}
}
}
公共类SliderAdapter扩展了PagerAdapter{
私人活动;
私有长[]图像ID;
私人充气机;
私有列表图像=新的ArrayList();
公共幻灯片适配器(活动,
长[]图像ID){
this.activity=(SliderActivity)活动;
this.imageIds=imageIds;
对于(int i=0;i=position&&images.get(position)!=null)
imgDisplay.setImageBitmap(images.get(position));
((ViewPager)容器)。添加视图(viewLayout);
返回视图布局;
}
@凌驾
公共项(视图组容器、int位置、对象){
((ViewPager)容器)。移除视图((RelativeLayout)对象);
}
@凌驾
public int getItemPosition(对象){
返回位置\无;
}
私有类GetImageTask扩展了AsyncTask{
私有最终字符串LOG_TAG=GetImageTask.class.getName();
私人长id;
公共GetImageTask(长id){
超级();
this.id=id;
}
@凌驾
受保护位图doInBackground(无效…参数){
//下载图像代码
}
@凌驾
受保护的void onPostExecute(位图imgBmp){
if(imgBmp!=null){
添加图像(imgBmp);
activity.adapter.notifyDataSetChanged();
}
}
}
}
问题可能是由图像造成的。。请阅读此处以优化图像
但是,如果您仍然遇到问题,请阅读此部分,并尝试使用毕加索组件处理图像。它将帮助您,因为它可以缓存图像
您可以在这里找到:最后,这是一个图像分辨率过高的问题,这会导致加载图像时速度缓慢。添加以下内容就足够了
BitmapFactory.Options options = new BitmapFactory.Options();
options.inDensity = 5;
options.inTargetDensity = 2;
Bitmap imgBmp = BitmapFactory.decodeByteArray(imgArray, 0,
imgArray.length, options);
当解码图像以降低分辨率时,viewpager会突然变得平滑。您的意思是只加载第二页需要时间,而其余页面正在加载好吗?是的。假设有3张图片。1->2速度很慢,然后2->3,3->2,2->1,1->2工作得很好。就像我刷到第二页时第二页“还没准备好”。我还尝试切换到FragmentPagerAdapter并将图片放入不同的片段中,但同样的问题仍然存在。我昨晚读到了关于它的文章,边睡觉边这么做。。lol。上面的链接显示了一个动画,应该和你的类似,第二页的速度也很慢,其余的过渡都很快。有点奇怪。。如果我发现有任何遗憾,我会联系你的