关于静态常量我不得感慨一下

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

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

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

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

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

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

名师定制,是一个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竟然添加了新的数据!!!!!!!

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

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

classBeens.addAll(SpinnerData.classObjects);

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

在Fragment里设置监听:

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

...}

@Override
public void onDataChanged() {
    classBeens.clear();
    classBeens.addAll(SpinnerData.classObjects);
}

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

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

  1. static
  2. 同步与异步
时间: 2024-10-29 12:33:32

关于静态常量我不得感慨一下的相关文章

静态常量static和方法重载

静态常量思维导图 有时在处理问题时,会需要两个类在同一个内存区域共享一个数据.这时没有必要在两个类中同时创建同一个常量,因为这样系统会将这两个不在同一个类中定义的常量分配到不同的内存空间中.可以将这个常量设置为静态的. 被声明为static的变量.常量和方法被称为静态成员.静态成员是属于类所有的,区别于个别对象,可以在本类或其他类使用类名和“.”运算符调用静态成员. 语法格式: 类名.静态类成员 注意: 虽然静态成员也可以使用“对象.静态成员”的形式进行调用,但这样的形式通常不被鼓励使用,因为这

1.封装,构造,重载,静态常量

1.对象:用来描述客观事务的一个实体 2.类:拥有相同属性和方法的对象一组“集合” 一.封装 1.隐藏一个类的属性.通过特定的方法访问! 2.将一个类的某一些信息隐藏在该类的内部,不允许外部程序直接访问,而是通过该类提供的方法对隐藏信息的操作.访问 特点: 隐藏类的实现细节. 通过特定的方法访问数据. 方便加入控制语句.保证数据的真实性 后期的修改 步骤流程: 1.修改属性的访问权限.用来控制对属性的访问 2.将属性私有.创建set.get方法!用于对属性的访问! 3.在set.get方法中加入

Cocos2d-x 3.1.1 学习日志2--error:只有静态常量整型数据成员才可以在类中初始化

今天遇到比较低端的一个问题,就是成员的初始化问题,编译器也无法验证,不同的编译器有些能过有些不能过,我也不知道为什么,总是我们以vs为准吧,以为我们用的环境就是它,话不多说,解决方案如下: 在类中    static const double PI=3.1416; error:只有静态常量整型数据成员才可以在类中初始化 常整型静态数据成员可以在类中直接初始化,而常实型静态数据成员不可以 class circle { int a; // 普通变量,不能在类中初始化 static int b; //

关于类中的引用、常量、静态常量的初始化

不过 下面所说的在新的 c++11中,已经有所改变. 比如程序中: static const double csd2 = 99.8; // error: 只有静态常量整型数据成员才可以在类中初始化已经可有在类中初始化了 关于这点,可以参考 这个博客 :http://blog.csdn.net/fjb2080/article/details/7527468 如下内容为摘抄自博客,由于几经整理,已经没有记录博客地址了,特此说明: 这一部分待学习:C++11 FAQ中文版:类成员的内部初始化 http

静态常量(static final)在class文件中是怎样的呢?

最近写项目遇到一个问题,来回折腾了几次,终于探究清楚了.不废话,上例子. 背景:因为项目小,没有使用配置文件,所有静态常量都放在Config.java里面了 public class Config { public static final String URL="http://www.xxxx.com/"; public static final int PAGE_NUM=10; } 看起来也不错啊,没什么大问题,都这么用的啊. 好吧,放到服务器上运行一下,正常啊. 接下来,问题来了

关于“只有静态常量整型数据成员才可以在类中初始化”

关于“只有静态常量整型数据成员才可以在类中初始化” 关于类中的静态成员变量, 在类中只能声明,不能定义注意在类的内部只是声明,不是定义 类中的静态变量是属于类的,不属于某个对象!不能在定义对象时对变量初始化!就时不能用构造函数来初始化!而且使用时应加上类名,而不是对象.例如: class A{ static int x; static int y; } int A::x=1; int A::y=2;//这样初始化! int main(){ cout<<A::x<<endl; cou

记录点滴之优化应用性能:Activity里面不要使用静态常量

我们在开发过程中,有时候Activity里面需要用到静态常量,作为初级开发者,我们经常会直接将静态常量定义在Activity里面,这样就会导致在Activity是不能够完全进行销毁的,也就说Activity依旧是占用一个线程的,除非强制杀死该线程,为了提高应用的性能,我们在开发的时候会专门建立一个类来保存这些静态常量,这样再使用的时候,我们只需要直接调用,这样在Activity退出的时候,该线程也将会撤销掉,从而提高应用的性能.

接口使用 --- 静态常量和抽象方法的歧义

接口多重继承的过程中,会遇到静态常量和抽象方法的歧义问题,下面一一分析. 静态常量歧义 静态常量歧义时,可通过接口名来访问歧义的静态常量. 抽象方法歧义 实现重载效果

静态常量测试1

/* *copyright(c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:静态常量测试 *作者:王忠 *完成日期:2014.11.13 *版本号:v1.0 * *问题描述:测试静态常量的用法 *输入描述: *程序输出: #include <iostream> using namespace std; int f(int n); int main() { cout<<f(5)<<" "; cout<&