Android PagerAdapter在第一次转换时变慢

Android PagerAdapter在第一次转换时变慢,android,android-viewpager,Android,Android Viewpager,我有一个ViewPager和一个PagerAdapter,它可以从远程服务器下载一些图像(通过它们的id)并显示它们。它几乎可以完美地工作,除了从第一个页面滑动到第二个页面时有点慢(比如1秒),而之后的所有其他转换都是正常的。这不是一个网络问题,因为即使我在刷卡之前等待了很长时间,问题仍然存在。 你知道为什么会这样吗 这是我的密码: public class SliderAdapter extends PagerAdapter{ private SliderActivity activity;

我有一个ViewPager和一个PagerAdapter,它可以从远程服务器下载一些图像(通过它们的id)并显示它们。它几乎可以完美地工作,除了从第一个页面滑动到第二个页面时有点慢(比如1秒),而之后的所有其他转换都是正常的。这不是一个网络问题,因为即使我在刷卡之前等待了很长时间,问题仍然存在。 你知道为什么会这样吗

这是我的密码:

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。上面的链接显示了一个动画,应该和你的类似,第二页的速度也很慢,其余的过渡都很快。有点奇怪。。如果我发现有任何遗憾,我会联系你的