屏幕关闭时,OnPause返回NullPointerException

时间:2014-03-04 18:43:56

标签: java android android-activity

我在TextView中正确初始化了Activity。 我可以在代码中使用它而没有任何问题。在onPause()方法中,我使用myTextView.setText("");。如果我按下主页按钮或我开始新的Activity,它可以正常工作,但是当我使用电源按钮关闭屏幕电源时,NullPointerException行会引发setText()

我想在调用onPause()之前,我的类成员会被关闭事件重置为null。 处理这种情况的正确方法是什么?

我应该抓住广播SCREEN_OFF还是我的代码中有错误?

我的代码就像

一样简单
@Override
protected void onPause(){
    myTextView.setText("");
    super.onPause();
}

Logcat输出

03-04 19:58:44.783: E/AndroidRuntime(6717): FATAL EXCEPTION: main
03-04 19:58:44.783: E/AndroidRuntime(6717): Process: com.myapp, PID: 6717
03-04 19:58:44.783: E/AndroidRuntime(6717): java.lang.RuntimeException: Unable to pause activity {com.myapp/com.myapp.MyActivity}: java.lang.NullPointerException
03-04 19:58:44.783: E/AndroidRuntime(6717):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2307)
03-04 19:58:44.783: E/AndroidRuntime(6717):     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3758)
03-04 19:58:44.783: E/AndroidRuntime(6717):     at android.app.ActivityThread.access$900(ActivityThread.java:145)
03-04 19:58:44.783: E/AndroidRuntime(6717):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212)
03-04 19:58:44.783: E/AndroidRuntime(6717):     at android.os.Handler.dispatchMessage(Handler.java:102)
03-04 19:58:44.783: E/AndroidRuntime(6717):     at android.os.Looper.loop(Looper.java:136)
03-04 19:58:44.783: E/AndroidRuntime(6717):     at android.app.ActivityThread.main(ActivityThread.java:5081)
03-04 19:58:44.783: E/AndroidRuntime(6717):     at java.lang.reflect.Method.invokeNative(Native Method)
03-04 19:58:44.783: E/AndroidRuntime(6717):     at java.lang.reflect.Method.invoke(Method.java:515)
03-04 19:58:44.783: E/AndroidRuntime(6717):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:781)
03-04 19:58:44.783: E/AndroidRuntime(6717):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-04 19:58:44.783: E/AndroidRuntime(6717):     at dalvik.system.NativeStart.main(Native Method)
03-04 19:58:44.783: E/AndroidRuntime(6717): Caused by: java.lang.NullPointerException
03-04 19:58:44.783: E/AndroidRuntime(6717):     at com.myapp.MyActivity.onPause(MyActivity.java:35)
03-04 19:58:44.783: E/AndroidRuntime(6717):     at android.app.Activity.performPause(Activity.java:5335)
03-04 19:58:44.783: E/AndroidRuntime(6717):     at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1233)
03-04 19:58:44.783: E/AndroidRuntime(6717):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2285)
03-04 19:58:44.783: E/AndroidRuntime(6717):     ... 11 more

以下是我初始化TextView

的方法
private TextView myTextView;
@Override
public void onResume() {
    super.onResume();
    //new AsyncTask
    //onPostExecute(){
    myTextView = (TextView) findViewById(R.id.textView1);
    //}}.execute();
}

我知道它是在AsyncTask内初始化的,但我绝对可以在Activity生命周期内使用它。我有一些Button,如果点击更改其文字并且它们有效,那么onPause()也可以。这仅在屏幕关闭时发生......

更新 出于某种奇怪的原因,当我按下电源按钮时,Activity按预期执行onPause(),然后onResume()onPause()。是什么导致这个?

2 个答案:

答案 0 :(得分:2)

我怀疑此处的问题是您没有先在方法中调用super.onPause()并获得SuperNotCalledException

你想要这样的东西:

@Override
protected void onPause() {
    super.onPause();
    myTextView.setText("");
}

答案 1 :(得分:0)

我在[this] [1]问题的答案中找到了我的问题的答案。 屏幕锁定在纵向模式下重新创建Activity,因为它是屏幕锁定后的Android默认行为。 之后立即致电onResumeonPause,导致NullPointerException,因为AsyncTask尚未完成他的工作。

所以我通过简单地检查值是否为空(尚未初始化)来解决这个问题