Android 大量倒计时卡顿的解决方案(Listview、RecyclerView、Timer、Handler、内存优化、内存泄漏、秒杀列表) 迈不过友情╰ 2021-09-07 06:09 1349阅读 0赞 如下商品列表秒杀,每一个商品都自带倒计时,如果每个商品都用timer或handler很容易出现卡顿甚至oom的情况 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaW1pbmdqdWU_size_16_color_FFFFFF_t_70][] 所以如果我只使用一个倒计时来管理这所有的时间实现起来会怎样呢? what?一个倒计时管理这全部?想想都恐怖...... 其实换个思维你会发现,一切如此简单: **我们不需要管这些时间剩多少,只需要管好每隔1秒告诉别人:兄弟,过1秒了。至于别人拿这一秒干嘛,那是别人的事。** so,只需要写一个工具类,每隔一段时间回调就行了 /** * 每个一段时间发送回调的倒计时工具类 * <p> * 一个handler管理所有的倒计时,防止创建过多的handler */ public class DaoJiShiUtils { private final HashSet<OnDaoJiShiListener> mSetListeners = new HashSet<>(); private final int mHandlerTime; @Nullable private final Activity mActivity; @SuppressLint("HandlerLeak")//本代码不会出现内存泄漏 private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if (mSetListeners.size() == 0 || (mActivity != null && mActivity.isFinishing())) { return; } Object[] listeners = mSetListeners.toArray(); for (Object listener : listeners) { //noinspection SuspiciousMethodCalls 做这一步判断是因为遍历过程中可能会被删掉 if (mSetListeners.contains(listener)) { ((OnDaoJiShiListener) listener).onZeroOneSecond(); } } sendEmptyMessageDelayed(1, mHandlerTime); } }; /** * @param activity 防止出现内存泄漏,此处强制要求传入当前Activity。不传也可以,但必须自己手动关掉{@link #stopAll} * @param intervals 发送间隔毫秒值,比如100表示0.1秒发一次、1000表示1秒发一次 */ @MainThread public DaoJiShiUtils(@Nullable Activity activity, int intervals) { mActivity = activity; mHandlerTime = intervals; } /** * 添加倒计时回调 */ @MainThread public void addTimeListener(@NonNull OnDaoJiShiListener listener) { if (mSetListeners.size() == 0) { mHandler.removeMessages(1); mHandler.sendEmptyMessageDelayed(1, mHandlerTime); } mSetListeners.add(listener); } /** * 删除倒计时 */ @MainThread public boolean removeTimeListener(@NonNull OnDaoJiShiListener listener) { return mSetListeners.remove(listener); } /** * 如果没传Activity,则需要手动停止 */ @MainThread public void stopAll() { mSetListeners.clear(); mHandler.removeCallbacksAndMessages(null); } /** * 监听 */ public interface OnDaoJiShiListener { /** * 每隔一段时间回调一次 */ void onZeroOneSecond(); } } 然后只要在Activity里new一个,Adapter都使用它即可 mDjs = new DaoJiShiUtils(this, 10); //... //adapter的适当位置 mDjs.addTimeListener(mTimeListener); 核心逻辑虽然少,但要想真正使用需要不少代码配合,下方有demo,可自行参考使用 **常见问题1:倒计时回调很多,导致重绘次数太多引起卡顿** 我们的倒计时都是固定长度固定格式的,所以我们只需要自定义一个倒计时的view(见demo的MyDaoJiShiView),数据加载好之后就不需要requestLayout了,直接拦截掉就不会重绘了(见demo的mIsRequestLayout) **常见问题2:明显你的demo滑动的时候也卡吗** 这是因为我比较懒,直接用了RecyclerView的notifyDataSetChanged,并且demo的倒计时到时间的特别多,会导致刷新次数过多而卡顿,并不是倒计时引起的卡顿,如有介意请自行优化。 demo或直接使用地址(MainActivity有具体使用):[https://github.com/weimingjue/CountdownUtil][https_github.com_weimingjue_CountdownUtil] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaW1pbmdqdWU_size_16_color_FFFFFF_t_70]: /images/20210907/18fbc7266dab4c2194a061b6ba9c0027.png [https_github.com_weimingjue_CountdownUtil]: https://github.com/weimingjue/CountdownUtil
相关 Android性能优化:内存泄漏排查及解决方案案例 内存泄漏是Android应用开发中常见的性能问题。以下是一个内存泄漏排查及其解决方案的案例。 案例描述: 一个使用Fragment进行页面跳转的应用。一段时间后,发现应用程序 怼烎@/ 2024年09月11日 15:30/ 0 赞/ 21 阅读
相关 jQuery实现倒计时秒杀效果------Sestid <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" c... 约定不等于承诺〃/ 2024年04月18日 11:42/ 0 赞/ 34 阅读
相关 Vue 大量数据展示卡顿解决方案(长列表优化) 需求分析(长列表展示) 页面某处需要渲染 1w+ 条数据,并需要滚动展示,这时如果直接把这些数据渲染到页面上,会导致系统内存大量被占用,导致页面卡顿或崩溃 我们都知道, 素颜马尾好姑娘i/ 2023年01月20日 15:53/ 0 赞/ 815 阅读
相关 用vue实现秒杀倒计时组件 用vue实现秒杀倒计时组件 开发思路 代码实现 下面是使用Vue实现秒杀倒计时组件 ![在这里插入图片描述][watermark_ty 绝地灬酷狼/ 2022年12月05日 05:25/ 0 赞/ 211 阅读
相关 Android----内存溢出、内存优化、内存泄漏 内存溢出(OOM):内存使用量大于JVM分配内存大小 加载对象过大 相对资源过多,内存来不及释放 发生内存泄漏 内存优化: 重写Activ 「爱情、让人受尽委屈。」/ 2022年06月18日 09:12/ 0 赞/ 493 阅读
相关 android studio 解决内存泄漏 自从Google在2013年发布了Android Studio后,Android Studio凭借着自己良好的内存优化,酷炫的UI主题,强大的自动补全提示以及Gradle的编译 布满荆棘的人生/ 2022年06月08日 07:24/ 0 赞/ 189 阅读
相关 Android内存泄漏优化总结 Android内存泄漏优化总结 什么是内存? Android中的内存是手机的RAM。主要包括如下几个部分: 1、寄存器 位于Cpu内部,速度最快。 2、 短命女/ 2022年06月07日 01:42/ 0 赞/ 256 阅读
相关 小程序秒杀倒计时 //倒计时 countDown: function (data,date) \{ // data为列表数据 此数据内含结束时间endTime date为服务器时间 痛定思痛。/ 2021年11月26日 18:38/ 0 赞/ 286 阅读
相关 Android 大量倒计时卡顿的解决方案(Listview、RecyclerView、Timer、Handler、内存优化、内存泄漏、秒杀列表) 如下商品列表秒杀,每一个商品都自带倒计时,如果每个商品都用timer或handler很容易出现卡顿甚至oom的情况 ![watermark_type_ZmFuZ3poZW5n 迈不过友情╰/ 2021年09月07日 06:09/ 0 赞/ 1350 阅读
还没有评论,来说两句吧...