Android中列表是每个应用都会有的UI效果,而与用户的交互无非就是用户上下滑动、左右滑动、点击item 等等,本文就从小编遇到一次加载大量数据而影响体验优化之旅。
项目的列表采用RecycleView + BaseMultiItemQuickAdapter 分组效果,数据量10000~20000以上
数据拉取、缓存
首先是数据的获取方式,分页?还是全部获取? 这得考虑到后端的查询效率,数据库可以采用建立索引,提高效率,前端可以采用分页获取,并且为了提高体验,当然是存储在本地数据库了(NoSql),这里就有一个问题分页获取分页 再存储,数据库存储会导致阻塞线程,
果然出现了:Message Blocked in Main Thread XXXX ms,这是anr日志,说明,执行了耗时任务,UI 无响应。。。。。。。。。。 所以就想到了 这里采用了线程控制存储(建议采用线程池的方式来实现,不然物极必反,过多创建线程,浪费了资源。。。)
public CustomerReposity(){
mThreadPool = new ThreadPoolExecutor(3, 5,
10, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(128));
}
复制代码
mThreadPool.execute(new Runnable() {
@Override
public void run() {
Log.d("customer","thread save to db ::"+data.list.size());
saveCustomerToLocalDB(data.list, pageNumer == 1);
}
});
复制代码
从后端拉取到解析-再到数据库的时间
这边其实考虑到序列化,序列化有两种 Serializable\Parcelable,Serializable 采用反射机制,会导致大量对象产生,所以,考虑到性能的话,采用Parcelable
@Override
public void <