最近面试时,面试官问了一个列表倒计时效果如何实现,然后脑袋突然懵的了O (∩_∩) O,现在记录一下。
实现方法主要有两个:
1。为每个开始倒计时的项目启动一个定时器,再做更新项目处理;
2。只启动一个定时器,然后遍历数据,再做再做更新项目处理。
经过思考,包括性能,实现等方面,决定使用第2种方式实现。
数据实体
/* * *总共的倒计时的时间(结束时间,开始时间),单位:毫秒 *例:2019-02-23 11:00:30与2019-02-23 11:00:00之间的相差的毫秒数 */私人长totalTime;/* * *倒计时是否在暂停状态 */私人布尔isPause=true;>之前倒计时
计时器
mTimer。日程安排(mTask 0 1000);TimerTask
类MyTask延伸TimerTask { @Override 公共空间run () { 如果(mList.isEmpty ()) { 返回; } int大?mList.size (); CountDownTimerBean豆; 长totalTime; for (int i=0;我& lt;大小;我+ +){ bean=mList.get(我); 如果(! bean.isPause()){//不处于暂停状态 totalTime=bean.getTotalTime () - 1000; 如果(totalTime & lt;=0) { bean.setPause(真正的); bean.setTotalTime (0); } bean.setTotalTime (totalTime); 消息消息=mHandler.obtainMessage (1); 消息。__arg1=我; mHandler.sendMessage(消息); } } } }线程交互更新项目
mHandler=新处理程序(Looper.getMainLooper ()) { @Override 公共空间handleMessage(消息味精){ 开关(msg.what) { 案例1: notifyItemChanged(味精。__arg1、“修改时间”); 打破; } }};性能优化方面
1。调用notifyItemChanged()方法后,不要更新整个条目(比如说物品包含图片,不需要变的),所以要重写onBindViewHolder (int,持有人列表
@Override 公共空间>/* * *销毁资源 */公共空间摧毁(){ mHandler.removeMessages (1); 如果(mTimer !=null) { mTimer.cancel (); mTimer.purge (); mTimer=零; } }RecyclerView。适配器部分源码
公开课CountDownTimerAdapter延伸RecyclerView.Adapter{ 私有静态最终字符串标签=癈ountDownTimerAdapter→”; 私人List mList;//数据 私人处理器mHandler;//线程调度,用来更新列的表 私人计时器mTimer; 私人MyTask mTask; 公共CountDownTimerAdapter () { ,mList=new ArrayList<的在(); mHandler=新处理程序(Looper.getMainLooper ()) { @Override 公共空间handleMessage(消息味精){ 开关(msg.what) { 案例1: notifyItemChanged(味精。__arg1、“修改时间”); 打破; } } }; mTask=new MyTask (); } 公共空间bindAdapterToRecyclerView (@NonNull RecyclerView视图){ view.setAdapter(这个); }/* * *设置新的数据源 * * @param列表数据 */公共空间setNewData (@NonNull List 列表){ destroy (); mList.clear (); mList.addAll(列表); notifyDataSetChanged (); 如果(mTimer==null) { mTimer=new计时器(); } mTimer。日程安排(mTask 0 1000); }/* * *销毁资源 */公共空间摧毁(){ mHandler.removeMessages (1); 如果(mTimer !=null) { mTimer.cancel (); mTimer.purge (); mTimer=零; } } @NonNull @Override 公共持有人onCreateViewHolder (@NonNull ViewGroup ViewGroup, int i) { 视图视图=LayoutInflater.from (viewGroup.getContext ()) .inflate (R.layout.item_count_down_timer viewGroup,假); 返回新持有人(查看); } @Override 公共空间onBindViewHolder (@NonNull持有人持有人,int位置,@NonNull List