android 变量为空,android-返回应用程序时,静态变量为null

android-返回应用程序时,静态变量为null

在我的应用程序中,有一个静态变量,当我从外部浏览器返回到我的应用程序时,该变量被设置为null。 如果我启动的外部网页足够复杂,似乎该应用程序或应用程序的某些部分将被杀死。

如果应用程序被完全杀死,然后从可以进行的主要活动中重新启动,但是重新启动是从启动浏览器的活动中进行的-但这并不意味着要设置应用程序状态,因此在访问null静态变量时会崩溃 。 这对我来说是六分之一的设备问题,因此我需要一些建议。

是否有设置标志来防止此行为?

8个解决方案

43 votes

这是大多数移动操作系统(绝对包括Android)中的标准行为。 实际上,如果其他一些具有更高优先级的应用程序(通常,如果它位于前台则是更高优先级)需要资源,则您的应用程序经常会被杀死。 这是由于具有相对有限的资源的移动设备的性质。

您应该将数据保存在更持久的位置。 您可能会发现有关常规数据存储的这篇文章很有用。 这个问题也应该相关:使用“保存实例状态”保存Android活动状态

请注意,这实际上不是六分之一的设备问题。 这是所有设备上的“问题”,在您的其中一台设备上更明显,可能是因为它的内存更少。 如果您在任何其他设备上运行占用大量内存的应用程序,则应该会看到相同的行为。 也没有标志来防止这种情况。 这是标准的和预期的。

kabuko answered 2019-11-14T03:06:32Z

20 votes

通常,这会在设备进入睡眠模式时发生。

可以通过以下步骤模拟设备的这种行为:

运行应用程序,然后按“主页”按钮

在左下角的Android Studio中,选择已调试的应用程序,然后按应用程序名称左侧的X按钮(终止应用程序)。 (不知道如何使用Eclipse,但我认为类似)

单击设备上的应用程序图标。

如果“任务”为活动,则该应用程序将在上一个活动时打开,并且(很可能)将生成错误,因为所有静态变量均已保留。

Vladimir Mamulov answered 2019-11-14T03:07:29Z

5 votes

不...您不应该将数据存储在android的静态变量中。 如果您坚持要这样做,那么当它为null时,您将需要能够从中恢复。.您应该使用捆绑包或其他方式保存您的状态。

Manfred Moser answered 2019-11-14T03:07:53Z

5 votes

在Android中使用static(单身)的解决方案非常简单:

实现一个扩展android.app.Application的类,并在onCreate()中进行所有单例初始化

推理:

即使由于内存不足而使应用程序的进程被终止的情况下,也会首先执行扩展Application的类

只要调用Application.onCreate(),您的应用程序便具有上下文

Someone Somewhere answered 2019-11-14T03:08:40Z

1 votes

您必须将值保存在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 iterator = Common.PERMISION_MAP.values()

.iterator();

ArrayList permissionList = new ArrayList();

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 permissionList = savedInstanceState

.getParcelableArrayList("PERMISSION_LIST");

if (Common.PERMISION_MAP == null)

Common.PERMISION_MAP = new HashMap();

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();

}

}

Mohamed Fadl Allah answered 2019-11-14T03:09:06Z

0 votes

您可能只想关注kabuko的第二个链接。 但是,如果您想保留静态变量(也许您对此有充分的理由),则可以这样做:

private static MyObjType getVariable()

{

if (myVar == null)

myVar = new MyObjType(); // do whatever else you need to here

return myVar;

}

这样,您可以用getVariable()。test()替换对myVar.test()的调用,并且知道它永远不会导致空指针异常。

Mark D answered 2019-11-14T03:09:39Z

0 votes

将应用程序类用于此类事情。 它总是在应用程序的任何组件(活动,服务,接收者)开始之前实例化的。 因此,您确定所有静态变量都已存在并已初始化。

Ali answered 2019-11-14T03:10:03Z

0 votes

每当您离开应用程序并切换浏览器时,您的应用程序就会进入后台。 因此,您需要按照以下步骤

首先在Sharedpreferece或savedInstanceState中初始化您的静态变量,如下所示

onResume()

要么

onResume()

在首次执行onResume()活动方法或其他方法时

其次,通过sharedpreference或saveInstance,以较早使用的方式在onResume()方法中重新初始化静态变量。

Himanshu Saxena answered 2019-11-14T03:10:56Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值