android 变量为空,android
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
android 变量为空,android
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