最近做Android项目中常见的ViewPager布局,感觉有几个小坑,我就想着写下来,考虑多所不周,以后有新的想法,再做补充。
1、ViewPager遇到网络异步加载时的优化问题:
1.1、有时候我通过ViewPager.setOffscreenPageLimit(width)来解决,width指的是当前Pager的两侧可以拓展的宽度。这种方法适合比较体量较小的UI元素,保证用户使用的连贯性。若用于存放类似大量图片的话,内存可能受不了。
1.2、虽然安卓手机的内存使用很局促,但是可以把网络异步加载的内容,写入外部cache,这个容量相对于内存很可观。这样当二次加载的时候,从cache里加载比网络还是快很多了。
2、ViewPager和标题栏互动的问题
2.1、通常我们滑动ViewPager的时候,希望相应的标题栏也获得响应(选定和居中)。对于自动居中,需要屏幕宽度高度数据,为此有以下几种等效方法:
方法一:
123WindowManager wm = (WindowManager)
this
.getSystemService(Context.WINDOW_SERVICE);
int
width = wm.getDefaultDisplay().getWidth();
int
height = wm.getDefaultDisplay().getHeight();
方法二:
123WindowManager wm1 =
this
.getWindowManager();
int
width1 = wm1.getDefaultDisplay().getWidth();
int
height1 = wm1.getDefaultDisplay().getHeight();
方法一与方法二获取屏幕宽度的方法类似,只是获取WindowManager 对象时的途径不同。
方法三:
12345DisplayMetrics outMetrics =
new
DisplayMetrics();
this
.getWindowManager()
.getDefaultDisplay().getMetrics(outMetrics);int
width2 = outMetrics.widthPixels;
int
height2 = outMetrics.heightPixels;
方法四:
12345 DisplayMetrics dm =this
.getResources()
getDisplayMetrics();float
density1 = dm.density;
int
width3 = dm.widthPixels;
int
height3 = dm.heightPixels;
方法三与方法四类似。
接下来对于标题栏的操作一般是Title.SmoothScrollTo(int x, int y),其中x,y是相对当前位置的偏移量
(比如从0移动到100,偏移量是0-100=-100);
3、警惕异步加载
为什么我说要警惕异步加载,因为在Android里面,耗时操作不允许放在主线程里,所有的耗时操作都要求放
在子线程里进行,如果我们在主线程里操作子线程返回的结果,我们经常会想当然的认为子线程结果已经返回,
所以这个时候我们很容易遇到空指针异常,所以在操作子线程的时候,你应该好好想想会对主线程有什么影响。