热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

优化后的标题:消息分发的撰写技巧与最佳实践

在消息分发过程中,使用`for`循环时可能会遇到新消息不断进入的问题,这需要一些特定的处理技巧。`LiveData`类提供了一种有效的解决方案,通过私有布尔变量`mDispatchingValue`来控制消息的分发过程,确保消息的有序和高效处理。此外,还可以结合`Observer`模式来进一步优化消息传递的可靠性和响应性。

用一个for循环分发消息的时候会碰到for执行的过程中有新的消息进来,这个处理起来就需要一点技巧,LiveData这个类给出了一个实现:

   private boolean mDispatchingValue;

    private boolean mDispatchInvalidated;
private void dispatchingValue(@Nullable ObserverWrapper initiator) {
        if (mDispatchingValue) {
            mDispatchInvalidated = true;
            return;
        }
        mDispatchingValue = true;
        do {
            mDispatchInvalidated = false;
            if (initiator != null) {
                considerNotify(initiator);
                initiator = null;
            } else {
                for (Iterator, ObserverWrapper>> iterator =
                        mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
                    considerNotify(iterator.next().getValue());
                    if (mDispatchInvalidated) {
                        break;
                    }
                }
            }
        } while (mDispatchInvalidated);
        mDispatchingValue = false;
    }

  它定义了两个变量:"mDispatchInvalidated"和“mDispatchingValue”,先看它的处理主体,do...while循环,条件是mDispatchInvalidated,进入执行mDispatchInvalidated的值被设置为false,如果传入的参数是NULL,走else把所有的消息遍历一遍分发下去处理,如果这个循环在执行的过程中有新的消息,mDispatchInvalidated的值就被设置为true,for循环中断,进入do...while循环,等于是更新了一个循环列表,把新增加的数据添进来for循环遍历执行。

     如果传入的参数非空,把传入数据处理掉后中while中检查mDispatchInvalidated是否为true,如果当前处理过程中执行的过程中有新数据产生,那么走do...while中的for循环把新数据处理一遍退出。

这个方法写的非常精练。


推荐阅读
  • 实现‘点击恢复’功能 - Tap-to-Resume Feature in SpriteKit
    了解如何在应用程序从非活动状态返回时,在SpriteKit游戏中添加一个‘点击恢复’的文字提示。 ... [详细]
  • Shiro功能拓展:登录失败重试次数限制
    本文详细介绍了如何在Apache Shiro框架中实现对用户登录失败重试次数的限制,通过自定义密码匹配器来增强系统的安全性。该方法不仅能够有效防止暴力破解攻击,还能确保合法用户的账户安全。 ... [详细]
  • 本文档详细介绍了Robot Framework的基础知识、安装配置方法及其实用技巧。从环境搭建到编写第一个测试用例,涵盖了一系列实用的操作指南和最佳实践。 ... [详细]
  • 应用程序配置详解
    本文介绍了配置文件的关键特性及其在不同场景下的应用,重点探讨了Machine.Config和Web.Config两种主要配置文件的用途和配置方法。文章还详细解释了如何利用XML格式的配置文件来调整应用程序的行为,包括自定义配置、错误处理、身份验证和授权设置。 ... [详细]
  • 本文探讨了在Java应用中,由于对象间循环引用导致重写toString方法时出现StackOverflowError的具体情况,并提供了有效的解决方案。 ... [详细]
  • 本文详细介绍了如何通过 `vue.config.js` 文件配置 Vue CLI 的打包和代理设置,包括开发服务器配置、跨域处理以及生产环境下的代码压缩和资源压缩。 ... [详细]
  • 本文探讨了在Java应用中实现线程池优雅关闭的两种方法,包括使用ShutdownHook注册钩子函数以及通过SignalHandler处理信号量。每种方法都提供了具体的代码示例,并讨论了可能遇到的问题及解决方案。 ... [详细]
  • 学习目的:1.了解android线程的使用2.了解主线程与子线程区别3.解析异步处理机制主线程与子线程:所谓主线程,在Windows窗体应用程序中一般指UI线程,这个是程序启动的时 ... [详细]
  • jme-燃烧的火焰
    jme的粒子效果也让人炫目:publicclassHelloParticleextendsSimpleApplication{publicstaticvoid ... [详细]
  • Flutter入门指南:实现自动关闭的对话框与提示
    本文为Flutter系列教程的一部分,专注于讲解如何在Flutter应用中实现自动关闭的对话框和提示。通过具体的代码示例,帮助开发者掌握SnackBar、BottomSheet和Dialog的使用方法。 ... [详细]
  • 手把手教你构建简易JSON解析器
    本文将带你深入了解JSON解析器的构建过程,通过实践掌握JSON解析的基本原理。适合所有对数据解析感兴趣的开发者。 ... [详细]
  • 本文深入探讨了Java注解的基本概念及其在现代Java开发中的应用。文章不仅介绍了如何创建和使用自定义注解,还详细讲解了如何利用反射机制解析注解,以及Java内建注解的使用场景。 ... [详细]
  • Flutter 高德地图插件使用指南
    本文档详细介绍了如何在Flutter项目中集成和使用高德地图插件,包括安装、配置及基本使用方法。 ... [详细]
  • 本文详细介绍了如何在Android游戏中实现360°平滑触屏摇杆,包括摇杆的基本设计原理和具体实现步骤。 ... [详细]
  • 我正在从数据库中提取一系列事件,并尝试加载与这些事件相关的所有用户及其个人资料。虽然用户信息能够成功加载,但用户的个人资料信息却未能一同加载。 ... [详细]
author-avatar
mobiledu2502872883
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有