多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
#### 12.3.2 优化列表的卡顿现象 这个问题困扰了很多开发者,其实答案很简单,不要在主线程中做太耗时的操作即可提高滑动的流畅度,可以从三个方面来说明这个问题。 首先,不要在getView中执行耗时操作。对于上面的例子来说,如果直接在getView方法中加载图片,肯定会导致卡顿,因为加载图片是一个耗时的操作,这种操作必须通过异步的方式来处理,就像ImageLoader实现的那样。 其次,控制异步任务的执行频率。这一点也很重要,对于列表来说,仅仅在getView中采用异步操作是不够的。考虑一种情况,以照片墙来说,在getView方法中会通过ImageLoader的bindBitmap方法来异步加载图片,但是如果用户刻意地频繁上下滑动,这就会在一瞬间产生上百个异步任务,这些异步任务会造成线程池的拥堵并随即带来大量的UI更新操作,这是没有意义的。由于一瞬间存在大量的UI更新操作,这些UI操作是运行在主线程的,这就会造成一定程度的卡顿。如何解决这个问题呢?可以考虑在列表滑动的时候停止加载图片,尽管这个过程是异步的,等列表停下来以后再加载图片仍然可以获得良好的用户体验。具体实现时,可以给ListView或者GridView设置setOnScrollListener,并在OnScrollListener的onScrollStateChanged方法中判断列表是否处于滑动状态,如果是的话就停止加载图片,如下所示。 public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { mIsGridViewIdle = true; mImageAdapter.notifyDataSetChanged(); } else { mIsGridViewIdle = false; } } 然后在getView方法中,仅当列表静止时才能加载图片,如下所示。 if (mIsGridViewIdle && mCanGetBitmapFromNetWork) { imageView.setTag(uri); mImageLoader.bindBitmap(uri, imageView, mImageWidth, mImageWidth); } 一般来说,经过上面两个步骤,列表都不会有卡顿现象,但是在某些特殊情况下,列表还是会有偶尔的卡顿现象,这个时候还可以开启硬件加速。绝大多数情况下,硬件加速都可以解决莫名的卡顿问题,通过设置android:hardwareAccelerated="true"即可为Activity开启硬件加速。