返回到应用程序时,静态variables为null
在我的应用程序中,有一个静态variables在从外部浏览器返回到我的应用程序时被设置为null。 看起来像应用程序或其中的一部分被杀死,如果我启动的外部网页是足够复杂的。
如果应用程序被完全杀死,然后从主要活动中恢复,那么可以重新启动,但重新启动来自启动浏览器的活动 – 并不是要设置应用程序状态,因此在访问空静态variables时会崩溃。 这对我来说是一个六分之一的设备问题,所以我需要一些build议。
有没有一个标志来防止这种行为?
这是大多数移动操作系统的标准行为,绝对包括Android。 实际上,如果某些具有更高优先级的其他应用程序(通常是前台优先级较高的应用程序)需要资源,则通常会导致您的应用程序死亡。 这是由于资源相对有限的移动设备的性质所致。
您应该将数据保存在更持久的地方。 您可能会发现这篇关于一般数据存储的文章是有用的。 这个问题也应该是相关的: 使用保存实例状态保存Android活动状态
请注意,这实际上不是六分之一的设备问题。 这是所有设备上的“问题”,这可能是因为它具有较less的内存而在您的某个设备上更为明显。 如果您在任何其他设备上运行内存密集型应用程序,则应该看到相同的行为。 也没有标志来防止这一点。 这是标准的和预期的。
通常这发生在设备进入睡眠模式时 。
设备的这种行为可以通过以下步骤来模拟:
- 运行应用程序, 然后按主页button
- 在左下angular的Android Studio中,selectdebugging应用程序,然后按应用程序名称左侧的Xbutton(终止应用程序)。 (不知道如何使用Eclipse,但我认为同样)
- 点击设备上的应用程序图标。
如果任务是活动,应用程序将打开最后一个活动,并且(很可能)会产生一个错误,因为所有的静态variables已经离开了 。
在Android中使用静态(单例)的解决scheme非常简单:
实现一个扩展android.app.Application
的类,并在onCreate()
完成所有的单例初始化
推理:
- 扩展应用程序的类首先被执行,即使你的应用程序的进程因内存不足而被终止
- 只要Application.onCreate()被调用,你的应用程序就有上下文了
不…你不应该存储在Android的静态variables的数据。 如果你坚持这样做,你将需要能够恢复,当它是空的..你应该保存你的状态捆绑或其他手段。
您必须将值保存在onSaveInstanceState中并将其返回到onRestoreInstanceState中,因为当活动进入停止状态生命周期时,所有静态值都将为null。
例如:
/* save my satatic hashmap in case of activity stopped to retrieve it again in onRestoreInstanceState method*/ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //Common.PERMISION_MAP static hashmap if (Common.PERMISION_MAP != null) { Iterator<Permission> iterator = Common.PERMISION_MAP.values() .iterator(); ArrayList<Permission> permissionList = new ArrayList<Permission>(); while (iterator.hasNext()) { Permission permission = (Permission) iterator.next(); permissionList.add(permission); } outState.putParcelableArrayList("PERMISSION_LIST", permissionList); } } /* restore my satatic hashmap when activity stopped */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); try { ArrayList<Permission> permissionList = savedInstanceState .getParcelableArrayList("PERMISSION_LIST"); if (Common.PERMISION_MAP == null) Common.PERMISION_MAP = new HashMap<Permission, Permission>(); for (Permission permission : permissionList) { Common.PERMISION_MAP.put(permission, permission); } } catch (Exception ex) { String string = ex != null ? ex.getMessage() : ""; Log.e(TAG, (string != null ? string : "")); ex.printStackTrace(); } }
你可能只想按照kabuko的第二个链接。 但是如果你想保持你的静态variables(也许你有这个原因),你可以这样做:
private static MyObjType getVariable() { if (myVar == null) myVar = new MyObjType(); // do whatever else you need to here return myVar; }
这样,你可以用getVariable()。test()replace你的调用myVar.test(),你知道它永远不会导致空指针exception。
使用应用程序类来做这些事情。 它总是在应用程序的任何组件(活动,服务,接收器)开始之前实例化。 所以你确定所有的静态variables都在那里并初始化。