安卓在最小化上长时间后开始活动



用户转到其他应用程序后,我的应用程序并没有关闭(通常情况下,它被最小化),但在我打开应用程序一段时间后,它崩溃了,因为NullPointerException。这是因为android清理了一些内存,一些变量不再可访问。有没有办法确定android是否清除了我应用程序的内存?或者什么是解决这个问题的好办法

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_payment);
    Bundle bundle = getIntent().getExtras();
    personId = bundle.getInt("personId");
    personName = bundle.getString("personName");
    lendStr = getResources().getString(R.string.lend);
    borrowStr = getResources().getString(R.string.borrow);

    setUpViews();
}

private void setUpViews() {
    SqlHelper db = new SqlHelper(this);
    Helper.centerActionBarTitle(this, db.getPerson(personId).getName(), false);
    tf = Typeface.createFromAsset(getAssets(), "FLEXO.TTF");
    tfFlexo = Typeface.createFromAsset(getAssets(), "FLEXO_BOLD.TTF");
    iv_add_row = (ImageView) findViewById(R.id.iv_add_row);
    iv_remove_row = (ImageView) findViewById(R.id.iv_remove_row);
    et_amount = (EditText) findViewById(R.id.et_amount);
    et_item_name = (EditText) findViewById(R.id.et_item_name);
    et_quantity = (EditText) findViewById(R.id.et_quantity);
    et_price = (EditText) findViewById(R.id.et_price);
    et_total_price = (TextView) findViewById(R.id.et_total_price);
    tv_currency = (TextView) findViewById(R.id.tv_currency);

    et_item_name.setText(getResources().getString(R.string.item));
    et_quantity.setText(getResources().getString(R.string.qty));
    et_price.setText(getResources().getString(R.string.price));
    et_total_price.setText(getResources().getString(R.string.total));
    tv_break = (TextView) findViewById(R.id.tv_break);
    tv_payment_date = (TextView) findViewById(R.id.tv_payment_date);
    tv_p_date = (TextView) findViewById(R.id.tv_p_date);
    tv_p_time = (TextView) findViewById(R.id.tv_p_time2);
    tv_maturity = (TextView) findViewById(R.id.tv_maturity);
    tv_m_time = (TextView) findViewById(R.id.tv_m_time);
    tv_m_date = (TextView) findViewById(R.id.tv_m_date);
    ll_list_wrapper = (LinearLayout) findViewById(R.id.ll_list_wrapper);
    tv_operation_type = (TextView) findViewById(R.id.tv_operation_type);
    chk_break_items = (ImageView) findViewById(R.id.chk_break_items);
    et_item_name.setTypeface(tfFlexo);
    et_quantity.setTypeface(tfFlexo);
    et_price.setTypeface(tfFlexo);
    et_total_price.setTypeface(tfFlexo);
    tv_operation_type.setTypeface(tf);
    tv_currency.setTypeface(tf);
    tv_break.setTypeface(tf);
    tv_payment_date.setTypeface(tf);
    tv_p_date.setTypeface(tf);
    tv_p_time.setTypeface(tf);
    tv_maturity.setTypeface(tf);
    tv_m_time.setTypeface(tf);
    tv_m_date.setTypeface(tf);
    int currencyIndex = MainActivity.settings.getCurrency();
    tv_currency.setText(Constants.currencies[currencyIndex]);
}

Logcat输出:

java.lang.RuntimeException:无法启动活动组件信息{com.lionshare.aldkan/com.lionsshare.aldkan.AddPayment}:java.lang.NullPointerException
 nbsp 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2355)
 nbsp nbsp;在android.app.ActivityThread.handleLaunchActivity(ActivityThreads.java:2391)
 nbsp nbsp;在android.app.ActivityThread.access$600(ActivityThreads.java:151)
 nbsp nbsp;在android.app.ActivityThread$H.handleMessage(ActivityThreads.java:1335)
 nbsp nbsp;在android.os.Handler.dispatchMessage(Handler.java:99)
 nbsp nbsp;在android.os.Looper.loop(Looper.java:155)
 nbsp nbsp;在android.app.ActivityThread.main(ActivityThread.java:5511)
 nbsp nbsp;在java.lang.reflect.Method.invokeNative(本机方法)
 nbsp nbsp;在java.lang.reflect.Method.ioke(Method.java:511)
 nbsp nbsp;在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
 nbsp nbsp;在com.android.internal.os.ZygoteInit.main(ZygoteNit.java:796)
 nbsp nbsp;位于dalvik.system.NativeStart.main(Native方法)
由:java.lang.NullPointerException引起
 nbsp nbsp;在com.lionshare.aldkan.AddPayment.setUpViews(AddPayment.java:188)
 nbsp nbsp;在com.lionshare.aldkan.AddPayment.onCreate(AddPayment.java:114)
 nbsp nbsp;在android.app.Activity.performCreate(Activity.java:5066)
 nbsp nbsp;在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101)
 nbsp nbsp;在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2311)
 nbsp nbsp;。。。11更多

实际上,在com.lionshare.aldkan.AddPayment.setUpViews(AddPayment.java:188)

MainActivity.settings.getCurrency()

它找不到MainActivity的静态变量settings。我认为该变量已从内存中清除。

这是因为Android系统破坏了您的活动实例。请参阅活动生命周期文档中的保存和恢复活动状态部分:

系统还可能破坏包含您的活动的流程如果活动处于"已停止"状态且尚未恢复内存长时间使用,或者前台活动需要更多资源。

为了防止这种崩溃,你必须用以下方法保存和恢复实例状态:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
}

最新更新