关于静态常量造成的那些见鬼的情况我不得感慨一下
2016-05-31 14:19
330 查看
如果在一个类的成员位置定义了静态变量,如果想类生成的时候这个变量初始化,就得在构造方法里初始化,而不能在成员位置。
实际开发时的情景:友盟分享,分享的标题在后台动态配置,没有网络的情况下显示默认值。
![](http://s2.51cto.com/wyfs02/M00/82/28/wKioL1dNPFSy440XAAAbxaNp6KE211.png)
见鬼的情况:在有网的情况下,分享之后,然后断网分享的标题竟然不是默认的TITLE,而是之前从网络获取的分享标题。后来我苦思冥想,在成员位置明明初始化了,怎么没有设置上默认的标题。
问题解决:最终的问题还在于static关键字,static的生命周期。在有网的情况下分享成功之后TITLE被赋与了新值,而在TITLE所在的类(一个Popwindow)重新加载的时候,TITLE并不会随着Popwindow的创建而创建,而是一直存在,一直保留着之前有网情况下分享的标题。
2.对于Adapter,如果它的数据源是静态变量的,数据源变了,adapter不需要notifydatasetchanged就会改变adapter的ui.
实际开发时的情景:Spinner加载数据。
![](http://s3.51cto.com/wyfs02/M02/82/29/wKioL1dNP_KSv1s2AAB76zZ-IRQ441.png)
名师定制,是一个Fragment,Spinner的数据是通过一个叫做SpinnerData的类进行管理的,里面全部是静态的变量和方法,在进入MainActivity里就通过getType()这个静态方法来请求数据,请求成功之后会将数据解析给classObjects这个静态的List。
错误代码1:在名师定制这个Fragment初始化的时候,
错误代码2:作者以为SpinnerData里有数据,将数据赋值给函数的Spinner
左边的Spinner点击的时候会联动右边的Spinner,其它的没有Spinner相关的数据请求操作。
见鬼的情况:两个Spinner竟然会有数据!!!!!!!!!!于是我猜想静态数据绑定adapter是不是不需要notify?做了下面一个试验,给adapter绑定静态的数据源,在按钮点击时只改变静态数据源,这时ListView竟然添加了新的数据!!!!!!!
![](http://s4.51cto.com/wyfs02/M02/82/2A/wKioL1dNQ5eAjz3qAAFPuY1j9z8264.png)
这就解释了两个Spinner怎么一开始设置的没有数据的数据源竟然会显示数据。
同时还有另外一个bug:如果不点击左边的spinner,直接点击右边的spinner,崩溃报classBeans角标越界。还是Fragment一开始下面这行代码的问题。
![](http://s1.51cto.com/wyfs02/M01/82/2A/wKioL1dNRXCzBgUUAAFRFts8-mY341.png)
在Fragment里设置监听:
3.接入Geesee直播平台,将它的Player写成单例之后出现的问题:
第一次进入app可以正常播放,再次进入就无法正常播放。如果卸载app重装第一次进入也能
正常播放,后来想想应该是Player的生命周期太长了,缓存太多播放的状态。
所以单例,static也要慎用啊!
-------------------------------------------------------------------------------------
有时候越是这种见鬼的问题,越可能是我们对于一些概念并没有真正的理解导致的。
static
同步与异步
实际开发时的情景:友盟分享,分享的标题在后台动态配置,没有网络的情况下显示默认值。
![](http://s2.51cto.com/wyfs02/M00/82/28/wKioL1dNPFSy440XAAAbxaNp6KE211.png)
见鬼的情况:在有网的情况下,分享之后,然后断网分享的标题竟然不是默认的TITLE,而是之前从网络获取的分享标题。后来我苦思冥想,在成员位置明明初始化了,怎么没有设置上默认的标题。
问题解决:最终的问题还在于static关键字,static的生命周期。在有网的情况下分享成功之后TITLE被赋与了新值,而在TITLE所在的类(一个Popwindow)重新加载的时候,TITLE并不会随着Popwindow的创建而创建,而是一直存在,一直保留着之前有网情况下分享的标题。
2.对于Adapter,如果它的数据源是静态变量的,数据源变了,adapter不需要notifydatasetchanged就会改变adapter的ui.
实际开发时的情景:Spinner加载数据。
![](http://s3.51cto.com/wyfs02/M02/82/29/wKioL1dNP_KSv1s2AAB76zZ-IRQ441.png)
名师定制,是一个Fragment,Spinner的数据是通过一个叫做SpinnerData的类进行管理的,里面全部是静态的变量和方法,在进入MainActivity里就通过getType()这个静态方法来请求数据,请求成功之后会将数据解析给classObjects这个静态的List。
错误代码1:在名师定制这个Fragment初始化的时候,
classBeens.addAll(SpinnerData.classObjects);实际我在debug的时候,SpinnerData.classObjects是没有真实的数据的。(在MainActivity里发起的异常请求还没有成功的解析出数据)
错误代码2:作者以为SpinnerData里有数据,将数据赋值给函数的Spinner
initSpinner1(context, spinner1, SpinnerData.typeNames); initSpinner2(context, spinner2, SpinnerData.GlassNames);这时我debug的时候SpinnerData.typeNames,SpinnerData.ClassNames仍然是没有数据的。后面除了
左边的Spinner点击的时候会联动右边的Spinner,其它的没有Spinner相关的数据请求操作。
见鬼的情况:两个Spinner竟然会有数据!!!!!!!!!!于是我猜想静态数据绑定adapter是不是不需要notify?做了下面一个试验,给adapter绑定静态的数据源,在按钮点击时只改变静态数据源,这时ListView竟然添加了新的数据!!!!!!!
![](http://s4.51cto.com/wyfs02/M02/82/2A/wKioL1dNQ5eAjz3qAAFPuY1j9z8264.png)
这就解释了两个Spinner怎么一开始设置的没有数据的数据源竟然会显示数据。
同时还有另外一个bug:如果不点击左边的spinner,直接点击右边的spinner,崩溃报classBeans角标越界。还是Fragment一开始下面这行代码的问题。
classBeens.addAll(SpinnerData.classObjects);因为在MainActivity里执行的SpinnerData的getType请求网络的方法,无法知道它何时回调成功。于是在SpinnerData类里写了个监听器,监听它的数据回调成功。
![](http://s1.51cto.com/wyfs02/M01/82/2A/wKioL1dNRXCzBgUUAAFRFts8-mY341.png)
在Fragment里设置监听:
@Override public void initData() { //监听数据源的变化,因为是异步调用的,我不知道数据什么时候发生了变化。 SpinnerData.setOnDataChangedListener(this);...}
@Override public void onDataChanged() { classBeens.clear(); classBeens.addAll(SpinnerData.classObjects); }
3.接入Geesee直播平台,将它的Player写成单例之后出现的问题:
第一次进入app可以正常播放,再次进入就无法正常播放。如果卸载app重装第一次进入也能
正常播放,后来想想应该是Player的生命周期太长了,缓存太多播放的状态。
所以单例,static也要慎用啊!
-------------------------------------------------------------------------------------
有时候越是这种见鬼的问题,越可能是我们对于一些概念并没有真正的理解导致的。
static
同步与异步
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories