`
1320438999
  • 浏览: 127473 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Android之项目全局变量的定义

 
阅读更多

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中用Application类实现全局变量

    ### Android中用Application类实现全局变量 在Android开发过程中,我们常常需要在多个组件之间共享数据,例如存储用户的登录状态、应用配置等信息。通常情况下,开发者会利用`SharedPreferences`或者`...

    android 全局变量使用

    android 全局变量的定义使用

    Android全局变量和Context

    Android全局变量和Context的实现方法

    Eclipse编写的Android全局变量应用实例

    总结来说,Eclipse V4.2.0作为Android开发的老牌工具,虽然目前已被Android Studio取代,但它仍然是学习和理解Android全局变量应用的良好平台。通过合理使用全局变量,开发者可以更高效地管理应用数据,但同时也需要...

    Android中的全局变量与局部变量使用小结

    在Android开发中,理解并恰当使用全局变量和局部变量是非常重要的。全局变量和局部变量是程序设计中的基本概念,它们各自有不同的作用域和生命周期,因此在编写代码时需要根据需求来选择合适的变量类型。 全局变量...

    使用Application做全局变量

    在Android开发中,全局变量的使用常常是为了在不同的Activity之间共享数据。`Application`类是Android框架提供的一种机制,允许开发者创建一个与应用程序生命周期绑定的单例对象,从而实现全局变量的效果。本篇文章...

    Android通过全局变量传递数据

    2 在AndroidMainfest xml中加入全局变量 android:name &quot; MyApp&quot; 3 在传数据类中获取全局变量Application对象并设置数据 myApp MyApp getApplication ; myApp setName &quot;jack&quot; ; 修改之后的...

    全局变量

    全局变量在编程中是一个重要的概念,特别是在IT领域...在Android开发中,理解全局变量的生命周期、作用域和与项目结构的关系是至关重要的。通过学习和实践,开发者可以更好地掌控全局变量,写出更健壮、可维护的代码。

    android系统中几种系统级别的全局变量

    android系统中几种系统级别的全局变量 在android 开发中时,尤其是在开发调试系统应用的时候,有时候需要设置一个系统级别的flag标志位,来提供给几个应用使用判断。例如开机完成后,或者走完开机导航后,都需要设置...

    android jni使用static变量

    在Java层定义一个静态变量: ```java public class MyJavaClass { public static int myStaticVar = 0; } ``` 要在JNI中访问这个静态变量,我们需要先编写C/C++代码,并在`Android.mk`或`CMakeLists.txt`文件中...

    详解Android中Application设置全局变量以及传值

    主要介绍了详解Android中Application设置全局变量以及传值的相关资料,希望通过本文大家能够理解掌握这部分内容,需要的朋友可以参考下

    uniapp集成colorUI uView组件库 vuex全局变量管理

    本项目是关于uniApp如何与colorUI、uView组件库以及Vuex进行集成,实现高效且统一的全局变量管理。 【colorUI】: ColorUI 是一款轻量级的前端 UI 组件库,专为 uni-app 设计。它提供了丰富的预设样式和组件,如...

    android Application全局传值替代Intent

    在这个`MyApplication`类中,我们定义了一个静态成员`instance`来保存`Application`实例,以及一个`sharedValue`来存储全局变量。`onCreate()`方法用于初始化`instance`,并提供`getInstance()`方法以便在其他组件中...

    智慧北京android项目代码

    在Android中,每个应用都有一个名为"Application"的全局单例对象,开发者可以继承这个类来自定义一些全局的行为,比如初始化全局变量、监听网络状态或者实现跨Activity的数据共享。 关于JSON文件,JSON(JavaScript...

    浅谈Android中关于静态变量(static)的使用问题

    - Application类在Android中作为一个全局单例,但它同样依赖于进程。进程被杀掉时,Application的实例也会被清空。尽管系统可以重建Application,但存储在其内部的数据将丢失,开发者需要自行处理这种情况。 5. **...

    vue 如何添加全局函数或全局变量以及单页面的title设置总结

    在Vue.js应用中,有时我们需要添加全局函数或全局变量,以便在多个组件之间共享和使用。此外,针对不同平台的浏览器兼容性问题,特别是在移动设备上,如iOS和Android,设置网页标题`&lt;title&gt;`也需要特别处理。以下是...

Global site tag (gtag.js) - Google Analytics