关于静态常量造成的那些见鬼的情况我不得感慨一下

简介:

  1. 如果在一个类的成员位置定义了静态变量,如果想类生成的时候这个变量初始化,就得在构造方法里初始化,而不能在成员位置。

  实际开发时的情景:友盟分享,分享的标题在后台动态配置,没有网络的情况下显示默认值

   

  wKioL1dNPFSy440XAAAbxaNp6KE211.png


  见鬼的情况:在有网的情况下,分享之后,然后断网分享的标题竟然不是默认的TITLE,而是之前从网络获取的分享标题。后来我苦思冥想,在成员位置明明初始化了,怎么没有设置上默认的标题。

  问题解决:最终的问题还在于static关键字,static的生命周期。在有网的情况下分享成功之后TITLE被赋与了新值,而在TITLE所在的类(一个Popwindow)重新加载的时候,TITLE并不会随着Popwindow的创建而创建,而是一直存在,一直保留着之前有网情况下分享的标题。


2.对于Adapter,如果它的数据源是静态变量的,数据源变了,adapter不需要notifydatasetchanged就会改变adapter的ui.

  实际开发时的情景:Spinner加载数据

  wKioL1dNP_KSv1s2AAB76zZ-IRQ441.png


  名师定制,是一个Fragment,Spinner的数据是通过一个叫做SpinnerData的类进行管理的,里面全部是静态的变量和方法,在进入MainActivity里就通过getType()这个静态方法来请求数据,请求成功之后会将数据解析给classObjects这个静态的List。


  错误代码1:在名师定制这个Fragment初始化的时候,

  

1
         classBeens.addAll(SpinnerData.classObjects);

  实际我在debug的时候,SpinnerData.classObjects是没有真实的数据的。(在MainActivity里发起的异常请求还没有成功的解析出数据)

   

  错误代码2:作者以为SpinnerData里有数据,将数据赋值给函数的Spinner

1
2
initSpinner1(context, spinner1, SpinnerData.typeNames);
initSpinner2(context, spinner2, SpinnerData.GlassNames);

  这时我debug的时候SpinnerData.typeNames,SpinnerData.ClassNames仍然是没有数据的。后面除了

左边的Spinner点击的时候会联动右边的Spinner,其它的没有Spinner相关的数据请求操作。

  

  见鬼的情况:两个Spinner竟然会有数据!!!!!!!!!!于是我猜想静态数据绑定adapter是不是不需要notify?做了下面一个试验,给adapter绑定静态的数据源,在按钮点击时只改变静态数据源,这时ListView竟然添加了新的数据!!!!!!!

  wKioL1dNQ5eAjz3qAAFPuY1j9z8264.png  

  这就解释了两个Spinner怎么一开始设置的没有数据的数据源竟然会显示数据。

  同时还有另外一个bug:如果不点击左边的spinner,直接点击右边的spinner,崩溃报classBeans角标越界。还是Fragment一开始下面这行代码的问题。

1
classBeens.addAll(SpinnerData.classObjects);

  因为在MainActivity里执行的SpinnerData的getType请求网络的方法,无法知道它何时回调成功。于是在SpinnerData类里写了个监听器,监听它的数据回调成功。

 wKioL1dNRXCzBgUUAAFRFts8-mY341.png

  在Fragment里设置监听:

  

1
2
3
4
@Override
public  void  initData() {
     //监听数据源的变化,因为是异步调用的,我不知道数据什么时候发生了变化。
     SpinnerData.setOnDataChangedListener( this );

 ...}

 

 

1
2
3
4
5
@Override
public  void  onDataChanged() {
     classBeens.clear();
     classBeens.addAll(SpinnerData.classObjects);
}

 

3.接入Geesee直播平台,将它的Player写成单例之后出现的问题:

    第一次进入app可以正常播放,再次进入就无法正常播放。如果卸载app重装第一次进入也能

 正常播放,后来想想应该是Player的生命周期太长了,缓存太多播放的状态。

 所以单例,static也要慎用啊!


-------------------------------------------------------------------------------------

有时候越是这种见鬼的问题,越可能是我们对于一些概念并没有真正的理解导致的。

  1. static

  2. 同步与异步





      本文转自屠夫章哥  51CTO博客,原文链接:http://blog.51cto.com/4259297/1784811,如需转载请自行联系原作者





相关文章
|
并行计算 TensorFlow 算法框架/工具
Tensorflow error(三):failed to get convolution algorithm,cuDNN failed to initialize
这篇文章讨论了TensorFlow在进行卷积操作时可能遇到的“failed to get convolution algorithm”错误,通常由于cuDNN初始化失败引起,并提供了几种解决方案,包括调整GPU内存使用策略和确保CUDA、cuDNN与TensorFlow版本兼容性。
235 1
Tensorflow error(三):failed to get convolution algorithm,cuDNN failed to initialize
|
9月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
607 280
|
安全 网络安全 开发工具
入职必会-开发环境搭建55-GitLab使用
本文详细介绍了GitLab使用, 包括管理员和普通开发人员的使用
230 4
入职必会-开发环境搭建55-GitLab使用
|
8月前
|
存储 算法 测试技术
CodeFuse-AAIS:改进低智能体框架助力高效程序修复
本文提出了一种基于低智能体框架的自适应自动化程序修复(APR)解决方案——AAIS。该方案结合了智能体的自适应性和低智能体的高效控制流,通过引入交互式缺陷定位和多模型辅助生成,显著提升了程序修复的准确性和多样性。实验结果表明,AAIS在SWE-Bench基准测试中表现出色,函数级定位准确率提升了46.94%-113.32%,Issue Solving任务上达到了35.67%的性能,展示了其在未来软件开发中的应用潜力。
199 0
CodeFuse-AAIS:改进低智能体框架助力高效程序修复
|
9月前
|
数据采集 人工智能 算法
《探秘人工智能之关联规则挖掘:解锁数据背后的隐藏联系》
关联规则挖掘是人工智能中发现数据项间潜在关联的关键技术,通过支持度、置信度和提升度等指标评估关联。其步骤包括数据预处理、频繁项集挖掘、规则生成与筛选。常用算法有Apriori、FP-Growth和Eclat。该技术广泛应用于市场营销、医疗和网络安全等领域,助力决策优化与发展。
423 16
|
存储 运维 关系型数据库
2024年最全ceph的功能组件和架构概述(2),Linux运维工程面试问题
2024年最全ceph的功能组件和架构概述(2),Linux运维工程面试问题
2024年最全ceph的功能组件和架构概述(2),Linux运维工程面试问题
|
Java Android开发 开发者
Android10 修改开发者选项中动画缩放默认值
Android10 修改开发者选项中动画缩放默认值
465 0
|
11月前
|
SQL 安全 算法
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享###
本文深入探讨了网络安全与信息安全的重要性,重点分析了网络安全漏洞、加密技术以及安全意识三个方面。通过详细阐述这些方面的基本概念、常见类型、应对措施及实际应用,旨在提升读者对网络安全防护的认识和理解。文章强调,在数字化时代,保障网络安全不仅是技术问题,更是关乎个人隐私、企业机密和国家安全的重要课题。 ###
|
Linux
3分钟带你了解Linux 中的 umount 命令
【7月更文挑战第7天】
654 0
3分钟带你了解Linux 中的 umount 命令
|
关系型数据库 应用服务中间件 nginx
部署开源项目管理工具focalboard
部署开源项目管理工具focalboard
374 0