有意引入空指针异常的一些代码如下:
// access modifiers omitted for brevity
class WhatIsYourNameActivity extends Activity {
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.writing);
// Just assume that in the real app we would really ask it!
MyApplication app = (MyApplication) getApplication();
app.setName("Developer Phil");
startActivity(new Intent(this, GreetLoudlyActivity.class));
}
}
// ====================================
// access modifiers omitted for brevity
class GreetLoudlyActivity extends Activity {
TextView textview;
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.reading);
textview = (TextView) findViewById(R.id.message);
}
void onResume() {
super.onResume();
MyApplication app = (MyApplication) getApplication();
textview.setText("HELLO " + app.getName().toUpperCase());
}
}
// ============================================= =========
adb shell ps
用户启动应用。 在WhatIsYourNameActivity中,您要求输入用户的名称并将其存储在MyApplication中。 在GreetLoudlyActivity中,您从MyApplication对象中获取用户名并显示它。 用户使用主页按钮离开应用程序。 几个小时后,Android默默杀死应用程序以回收一些内存。
到目前为止,非常好!
但是这里出现了崩溃的部分......
用户重新打开该应用。 Android创建一个新的MyApplication实例并恢复GreetLoudlyActivity。 GreetLoudlyActivity获取用户的名称,该名称现在为null,并且使用NullPointerException崩溃。
由于Application对象是全新的,因此发生崩溃,因此name变量为null,当我们在其上调用String#toUpperCase()时会导致NullPointerException。
命令行,在模拟器或root手机上运行时: 启动应用程序,然后:
adb shell ps | grep com.crashy.package
在设备和命令行上按home:
adb shell kill <PID from above step>
和:
{{1}}
现在,我们尝试使用最新应用标签从后台恢复应用,并按预期崩溃。问题是如何列出与进程一起被杀死的所有对象的状态 - 或者杀死进程是否会杀死所有关联的对象?有没有办法分叉这个过程?
答案 0 :(得分:2)
“......或者杀死进程会杀死所有关联对象吗?”
这正是发生的事情。当一个进程被终止时,操作系统将回收它所有拥有的内存 - 如果没有发生这种情况,每次进程死机并且操作系统最终会耗尽内存时会出现内存泄漏。
一旦进程/应用程序终止,您将丢失未保存到永久存储的所有内容。
答案 1 :(得分:-1)
问题是你试图用一个简单的变量来模拟持久存储。为了更好地理解,我会调查Android Activity的生命周期,以了解应用程序被“杀死”的方式和时间http://developer.android.com/training/basics/activity-lifecycle/index.html
现在我建议使用共享首选项管理器。(您的数据看起来不够大,无法证明sqlLite数据库的合理性)
在您的存储活动中,使用此
保存名称SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this)
Preferences.Editor edit = preferences.edit();
edit.putString('name', 'someName');
edit.commit();
使用
在其他活动中检索它SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this)
preferences.getString('name');