static修饰的静态变量,使用很方便,在不同的类和包中都可以使用,在虚拟机中单独占用内存,没错,这些都是它们的优点,不过在项目上线后,才发现static有一些不太好的地方。
在查看项目的崩溃信息时,发现很多地方莫明的出现空指针异常的错误,经过排查,发现可能就是static的问题。我们在项目中,将用户的信息也就是User对象保存成了一个静态变量,而在报错的地方,也都发现有使用过这种变量,因此,可以大致推断出与这种保存的方式有一定的联系。同时,有不少用户反映在打开应用的情况下,接个电话或者长时间待机后,再回到应用也会出现崩溃的现象,而这些崩溃都与静态变量的空指针有关系。
如此来说的话,static静态修饰在Android的开发中是不是很危险?或许我们可以说如果是static User u = new User();这样定义的话,那么应该不会有太大问题,而如果是static User u;这样定义的话,那么很可以会出现NULL的现象。当然,前面的方法里面的属性也可能会现空的情况,但是这个可以用封装来避免空指针。另外静态常量还是很好用的。
那么应该如何保存登录或者全局的信息呢?根据Google官方的推荐以及百度到的各位大神的推荐,我们应该尽量使用继承自Application的自定义类,在我们继承的类中定义需要全局使用的变量,并通过getApplicationContext()来获取和保存相关的变量即可。
/**
* 自定义的MyApplication继承Application
*
* @author way
*
*/
public class MyApplication extends Application {
/**
* 引发异常:在一些不规范的代码中经常看到Activity或者是Service当中定义许多静态成员属性。这样做可能会造成许多莫名其妙的 null
* pointer异常。
*/
/**
* 异常分析:Java虚拟机的垃圾回收机制会主动回收没有被引用的对象或属性。在内存不足时,虚拟机会主动回收处于后台的Activity或
* Service所占用的内存。当应用再次去调用静态属性或对象的时候,就会造成null pointer异常
*/
/**
* 解决异常:Application在整个应用中,只要进程存在,Application的静态成员变量就不会被回收,不会造成null pointer异常
*/
private int number;
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
不过,为了让我们的MyApplication取代android.app.Application的地位,在我们的代码中生效,我们需要修改AndroidManifest.xml:
<application android:name=".MyApplication" ...>
</application>
下面我们就可以在Activity或Service中灵活使用了:
MyApplication application = (MyApplication) this.getApplicationContext();
//保存变量
application.setNumber(5);
//取出变量
application.getNumber();
Application是与应用同时存在的,也就是应用在它就在,并不会被GC给莫名其妙的回收掉,因此,使用此方法更加安全。
分享到:
相关推荐
android 全局变量的定义使用
Android中用Application类实现全局变量
Android全局变量和Context的实现方法
2 在AndroidMainfest xml中加入全局变量 android:name " MyApp" 3 在传数据类中获取全局变量Application对象并设置数据 myApp MyApp getApplication ; myApp setName "jack" ; 修改之后的...
主要介绍了详解Android中Application设置全局变量以及传值的相关资料,希望通过本文大家能够理解掌握这部分内容,需要的朋友可以参考下
至于本人则是经常定义全局变量使用,但也就是因为这样,定义的是全局变量。也饶了不少的弯子。 在使用Adapter即适配器的时候,通常适配器总是与listView使用,因为一个listView 基本上都会有一个listView的Item的...
这是我自己写的android jni调用java static属性的例子
android系统中几种系统级别的全局变量 在android 开发中时,尤其是在开发调试系统应用的时候,有时候需要设置一个系统级别的flag标志位,来提供给几个应用使用判断。例如开机完成后,或者走完开机导航后,都需要设置...
项目中,在不停地接收串口数据很长一段时间(几小时)后,会偶然性的报错。初步排除了oom和cpu紧张问题,因为是工业平板不方便调试,用了些比较笨的方法最后锁定在几个用了static的地方。在这里记录下Android中使用...
首先在index.html中定义一个全局的函数: var setTitle = function (title) { var u = navigator.userAgent var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1 var isiOS = !!u.match
54 :set foldmethod expr #定义折叠方式为自定义表达式 55 :set foldexpr getline v:lnum [0] " "&&getline v:lnum [1] "m "&&getline v:lnum [2] "e "&&...
23.1.1 探索Android全局搜索 23.1.2 为全局搜索启用建议提供程序 23.2 活动与搜索键交互 23.2.1 常规活动上的搜索键行为 23.2.2 禁用了搜索的活动的行为 23.2.3 通过菜单显式调用搜索 23.2.4 ...
因为所有的编译文件都在同一个 GNU MAKE 执行环境中进行执行,而Android.mk中所有的变量都是全局的。因此,您应尽量少声明变量,不要认为某些变量在解析过程中不会被定义
android组件化开发demo。通过定义全局变量IsBuildSignle实现android组件化开发功能,代码已剔除成最简
23.1.1 探索Android全局搜索 23.1.2 为全局搜索启用建议提供程序 23.2 活动与搜索键交互 23.2.1 常规活动上的搜索键行为 23.2.2 禁用了搜索的活动的行为 23.2.3 通过菜单显式调用搜索 23.2.4 ...
您需要运行此项目的参数如下:在詹金斯上定义全局环境变量。 为了能够在您配置了Jenkins的任何系统中执行管道,您需要在Jenkins的全局配置中定义几个环境变量。 首先,转到“管理Jenkins” ->“配置系统” ->,然后...
本节向你展示如何在任务中发送数据给UI线程里的对象,这...在创建线程池的类的构造器里实例化Handler对象,保存在全局变量里。用Handler(Looper)方法实例化,连接到UI线程,构造方法使用Looper对象,也是Android系统线
StringFormat的使用 扩展: 定义全局变量:网络地址