2017-07-19 80 views
-1

我正在使用帶片段的TabLayout活動。一切正常,直到另一個活動在前面,當它返回到TabLayout活動時,它有時會拋出一個nullpointexception。返回應用程序時出現NullpointerException

這個函數在我的MainActivity中。 super.onPause之後的代碼似乎在用戶返回活動時被調用。該代碼通知一個片段,該片段稱爲onpause。

@Override 
protected void onPause() { 
    super.onPause(); 

    myPreferences.setBoolPreferences(MyPreferences.MY_PREFS_START, false); 
    ((FragmentInterface) mSectionsPagerAdapter.getItem(tabLayout.getSelectedTabPosition())).onRunPermissionChanged(); 

    flashLight.off(); 
} 

這裏是片段中的代碼。

@Override 
public void onRunPermissionChanged() { 
    if(myPreferences.getBoolPreferences(MyPreferences.MY_PREFS_START, MyPreferences.MY_PREFS_START_DEFAULT)){ 
     disco.start(viewBackground, imageViewDiscoBall); 
    } else { 
     stopDisco(); 
    } 
} 

不過,我得到的喜好空指針異常對象,而這是在OnCreateView初始化。

07-19 21:32:52.984 7829-7829/com.tomhogenkamp.NeonDiscoLight E/AndroidRuntime: FATAL EXCEPTION: main 
                       Process: com.tomhogenkamp.NeonDiscoLight, PID: 7829 
                       java.lang.RuntimeException: Unable to pause activity {com.tomhogenkamp.NeonDiscoLight/com.tomhogenkamp.NeonDiscoLight.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.tomhogenkamp.NeonDiscoLight.MyPreferences.getBoolPreferences(java.lang.String, boolean)' on a null object reference 
                        at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3660) 
                        at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3604) 
                        at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3572) 
                        at android.app.ActivityThread.access$1100(ActivityThread.java:150) 
                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1410) 
                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                        at android.os.Looper.loop(Looper.java:168) 
                        at android.app.ActivityThread.main(ActivityThread.java:5885) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) 
                       Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.tomhogenkamp.NeonDiscoLight.MyPreferences.getBoolPreferences(java.lang.String, boolean)' on a null object reference 
                        at com.tomhogenkamp.NeonDiscoLight.FragmentDisco.onRunPermissionChanged(FragmentDisco.java:104) 
                        at com.tomhogenkamp.NeonDiscoLight.MainActivity.onPause(MainActivity.java:247) 
                        at android.app.Activity.performPause(Activity.java:6374) 
                        at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1412) 
                        at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3639) 
                        at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3604)  
                        at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3572)  
                        at android.app.ActivityThread.access$1100(ActivityThread.java:150)  
                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1410)  
                        at android.os.Handler.dispatchMessage(Handler.java:102)  
                        at android.os.Looper.loop(Looper.java:168)  
                        at android.app.ActivityThread.main(ActivityThread.java:5885)  
                        at java.lang.reflect.Method.invoke(Native Method)  
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)  
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)  

有時它可以工作,但有時會拋出一個空指針異常。我該如何解決這個問題?

+0

當你初始化myPreferences? –

+0

在OnCreateView方法中。 – tomhogenkamp

+0

我不知道是否有幫助,但在onPause()你設置布爾首選項,但不提交更改嘗試使用Saredpreferences.Editor並提交更改 –

回答

0

問題是您的代碼可能在創建視圖之前執行。

請注意,您是如何在OnCreateView中初始化此值的。根據設備當前正在執行的代碼的速度,調用碎片方法的代碼可能在OnCreateView之前的碎片已被調用,這是您的空指針來自哪裏。

我看到您需要根據設置調用主要活動中的方法。將此代碼移動到您的片段OnCreateView,並使您需要在MainActivity public中調用的方法。

然後,訪問它們的片段,像這樣 ((MainActivity)getActivity()).stopDisco()

+0

但是,當應用程序啓動時,所有的片段被創建。所以偏好對象應該存在嗎? – tomhogenkamp

+0

請粘貼你如何初始化變量,我沒有意識到nullpointer是在mainactivity而不是片段。我會編輯我的答案,以便在向我展示它的初始化後更好地幫助您。 – astrade

+0

變量在片段中是全局的,當調用OnCreateView時,我初始化它(myPreferences = new My Preferences(getContext());)。空指針在片段中,我從主活動調用函數。但由於某些原因,偏好對象有時爲空。像物體被摧毀? – tomhogenkamp

相關問題