关于ViewPager优化

1.使用Fragment加载轻量级的页面,布局优化(因为ViewPager每个item都加载了很多个布局比较深的View,加上动画就非常卡顿,所以采用Viewpager预加载的功能(初始化的时候去设置预加载数),并且让他加载第0页的pager的同时,就去预加载其他页,并且不让Viewpager销毁页面(重写adapter的ondestoryitem方法),缺点是过于耗内层,)

private void initView() {
// TODO Auto-generated method stub
viewPager = (ViewPager) findViewById(R.id.id_viewpager);
pagerAdapter = new MyAdapter(mcontext, mImgIds);
viewPager.setOffscreenPageLimit(3);
viewPager.setAdapter(pagerAdapter);
viewPager.setPageTransformer(true, new pagerAnimation());
}

2.快速滑动优化
在快速滑动的时候我们不需要去加载内容,可以使用延时任务handler。postDelay(Runable,500),在初始化的时候我们只需要加载一个空的布局,当用户在这个页面停留超过多少秒的时候我,们在去加载我们的内容,如果用户切换到了其他页面,我们直接取消任务(缺陷是Viewpager的setUserVisibleHint是判断用户是否滑动到其他页面,当滑动量不足的时候,会会退到当前页面,我们取消了异步任务,ViewPager不会重新加载异步任务)
实现:
首先,设置延迟任务
private Runnable LOAD_DATA = new Runnable() {
@Override
public void run() {
//在这里数据内容加载到Fragment上
}
};
启动任务
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//初始化视图,这里最好先设置一个进度对话框,提示用户正在加载数据
initView();
//启动任务,这里设置500毫秒后开始加载数据 handler.postDelayed(LOAD_DATA,500)
return view;
}
若用户切换到其他Fragment则取消任务
//判断Fragment是否可视的重载方法
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
  super.setUserVisibleHint(isVisibleToUser);
    if(!isVisibleToUser)
     mHandler.removeCallbacks(LOAD_DATA);
}

3.优化上面2的ViewPager方法,监听ViewPager的OnPageChangeListener方法,当滑动到其他页面的时候取消之前的所有异步任务,利用position%4拿到第几个控件从mViews取值,保证了viewpager加载的mViews存储的图片为4个

4.解决ViewPager加载图片过多造成oom的解决办法,利用ViewPager的重用机制
for (int i = 0; i < 4; i++) {
SubsamplingScaleImageView view = new SubsamplingScaleImageView(this);
mViews.add(view);
}

   mBinding.viewpager.setAdapter(new MyAdapter());  

[java] view plain copy
class MyAdapter extends PagerAdapter {

    @Override  
    public int getCount() {  
        return mDatas.size();  
    }  

    @Override  
    public boolean isViewFromObject(View view, Object object) {  
        return view == object;  
    }  

    @Override  
    public Object instantiateItem(ViewGroup container, final int position) {  

        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(  
                ViewPager.LayoutParams.MATCH_PARENT,ViewPager.LayoutParams.MATCH_PARENT);  

        int i = position % 4;  
        final SubsamplingScaleImageView imageView = mViews.get(i);  
        imageView.setLayoutParams(params);  

        final String url = mDatas.get(position);  
        String cacheExists = cacheExists(url);  
        if(TextUtils.isEmpty(cacheExists)) {//没缓存 需要压缩(压缩耗时 异步)  
            new AsyncTask() {  
                @Override  
                protected String doInBackground(Void... voids) {  
                    String cacheNoExistsPath = getCacheNoExistsPath(url);  
                    BitmapCompressUtils.compressBitmap(url, cacheNoExistsPath);  
                    File file = new File(cacheNoExistsPath);  
                    if (file.exists()) {//存在表示成功  
                        return cacheNoExistsPath;  
                    } else {  
                        return url;  
                    }  
                }  

                @Override  
                protected void onPostExecute(String s) {  
                    imageView.setImage(ImageSource.uri(s));  
                }  

            }.execute();  


        } else {//有缓存 直接显示  
            imageView.setImage(ImageSource.uri(cacheExists));  
        }  

        container.addView(imageView);  
        return imageView;  

    }  

    @Override  
    public void destroyItem(ViewGroup container, int position, Object object) {  
        int i = position % 4;  
        SubsamplingScaleImageView imageView = mViews.get(i);  
        if(imageView != null) {  
            imageView.recycle();  
        }  

        container.removeView(imageView);  

    }  

你可能感兴趣的:(app优化问题)