安卓中static使用误区
来源:互联网 发布:游轮网络 编辑:程序博客网 时间:2024/05/17 07:37
static 修饰的静态变量,使用很方便,在不同的类和包中都可以使用,在虚拟机中单独占用内存,没错,这些都是它们的优点,不过在项目上线后,才发现static有一些不太好的地方。
在查看项目的崩溃信息时,发现很多地方莫明的出现空指针异常的错误,经过排查,发现可能就是static的问题。我们在项目中,将用户的信息也就是User对象保存成了一个静态变量,而在报错的地方,也都发现有使用过这种变量,因此,可以大致推断出与这种保存的方式有一定的联系。同时,有不少用户反映在打开应用的情况下,接个电话或者长时间待机后,再回到应用也会出现崩溃的现象,而这些崩溃都与静态变量的空指针有关系。
如此来说的话,static静态修饰在Android的开发中是不是很危险?或许我们可以说如果是static User u = new User();这样定义的话,那么应该不会有太大问题,而如果是static User u;这样定义的话,那么很可以会出现NULL的现象。当然,前面的方法里面的属性也可能会现空的情况,但是这个可以用封装来避免空指针。另外静态常量还是很好用的。
那么应该如何保存登录或者全局的信息呢?根据Google官方的推荐以及百度到的各位大神的推荐,我们应该尽量使用继承自Application的自定义类,在我们继承的类中定义需要全局使用的变量,并通过getApplicationContext()来获取和保存相关的变量即可。实例:
- package com.jony.bitmaptest;
- import android.app.Application;
- import android.os.Handler;
- public class MyAplication extends Application{
- // 引发异常:在一些不规范的代码中经常看到Activity或者是Service当中定义许多静态成员属性。这样做可能会造成许多莫名其妙的null pointer异常。
- // 异常分析:Java虚拟机的垃圾回收机制会主动回收没有被引用的对象或属性。在内存不足时,虚拟机会主动回收处于后台的Activity或Service所
- // 占用的内存。当应用再次去调用静态属性或对象的时候,就会造成null pointer异常
- // 解决异常:Application在整个应用中,只要进程存在,Application的静态成员变量就不会被回收,不会造成null pointer异常
- private static final int MSG = 0X1;
- private Handler mHandler = new Handler(){
- public void handleMessage(android.os.Message msg) {
- switch (msg.what) {
- case MSG:
- break;
- default:
- break;
- }
- };
- };
- private String action;
- private String username;
- private String password;
- @Override
- public void onCreate() {
- // TODO Auto-generated method stub
- super.onCreate();
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getAction() {
- return action;
- }
- public void setAction(String action) {
- this.action = action;
- }
- public Handler getHandler(){
- return mHandler;
- }
- }
package com.jony.bitmaptest;import android.app.Application;import android.os.Handler;public class MyAplication extends Application{ // 引发异常:在一些不规范的代码中经常看到Activity或者是Service当中定义许多静态成员属性。这样做可能会造成许多莫名其妙的null pointer异常。 // 异常分析:Java虚拟机的垃圾回收机制会主动回收没有被引用的对象或属性。在内存不足时,虚拟机会主动回收处于后台的Activity或Service所 // 占用的内存。当应用再次去调用静态属性或对象的时候,就会造成null pointer异常 // 解决异常:Application在整个应用中,只要进程存在,Application的静态成员变量就不会被回收,不会造成null pointer异常 private static final int MSG = 0X1; private Handler mHandler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case MSG: break; default: break; } }; }; private String action; private String username; private String password; @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getAction() { return action; } public void setAction(String action) { this.action = action; } public Handler getHandler(){ return mHandler; }}
在Activity或Service中的使用方法:
- MyApplication application = (MyApplication) this.getApplicationContext();
MyApplication application = (MyApplication) this.getApplicationContext();
Application是与应用同时存在的,也就是应用在它就在,并不会被GC给莫名其妙的回收掉,因此,使用此方法更加安全。
链接地址
http://www.2cto.com/kf/201205/133951.html
- 安卓中static使用误区
- Android static静态成员变量的使用误区
- Android static静态成员变量的使用误区
- C++ 静态static 变量在 cocos2d-x 里面使用误区
- Android static静态成员变量的使用误区
- Android static静态成员变量的使用误区
- Android static静态成员变量的使用误区
- Android static静态成员变量的使用误区
- static误区,ViewState使用方法
- Android static的误区
- Android 如何定义全局变量 以及 static静态变量使用误区 的问题
- auto_ptr的使用误区
- RegisterStartupScript 使用误区
- RegisterStartupScript 使用误区
- 指针的使用误区
- volatile 使用误区
- 单片机汇编程序使用误区
- shell常见使用误区
- hashtable基础
- 循环链表--约瑟夫环问题
- updater-script
-  |"|&|<|>等html字符转义
- CCF 送货
- 安卓中static使用误区
- 位运算--hdu5980 Find Small A
- (windows)MongoDB安装与配置+坑
- 解决canvas不清晰问题
- github使用教程(二)
- LeetCode 557. Reverse Words in a String III(C++版)
- ARM NEON 编程系列4——如何将neon用来优化我们的程序
- get、post、put三种写法
- 全志平台,移植车机外设驱动总结(蓝牙、WIFI、GPS、Gsensor等)