-1

嘗試運行應用程序時,我意外地收到以下NullPointer異常錯誤。NullPointerException - Fragment問題

09-22 18:30:49.053: E/AndroidRuntime(3731): FATAL EXCEPTION: main 
    09-22 18:30:49.053: E/AndroidRuntime(3731): Process: com.dooba.beta, PID: 3731 
    09-22 18:30:49.053: E/AndroidRuntime(3731): java.lang.NullPointerException 
    09-22 18:30:49.053: E/AndroidRuntime(3731):  at com.dooba.beta.Fragment2$5.done(Fragment2.java:410) 
    09-22 18:30:49.053: E/AndroidRuntime(3731):  at com.parse.FindCallback.internalDone(FindCallback.java:45) 
    09-22 18:30:49.053: E/AndroidRuntime(3731):  at com.parse.FindCallback.internalDone(FindCallback.java:31) 
    09-22 18:30:49.053: E/AndroidRuntime(3731):  at com.parse.Parse$6$1.run(Parse.java:917) 
    09-22 18:30:49.053: E/AndroidRuntime(3731):  at android.os.Handler.handleCallback(Handler.java:733) 
    09-22 18:30:49.053: E/AndroidRuntime(3731):  at android.os.Handler.dispatchMessage(Handler.java:95) 
    09-22 18:30:49.053: E/AndroidRuntime(3731):  at android.os.Looper.loop(Looper.java:136) 
    09-22 18:30:49.053: E/AndroidRuntime(3731):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
    09-22 18:30:49.053: E/AndroidRuntime(3731):  at java.lang.reflect.Method.invokeNative(Native Method) 
    09-22 18:30:49.053: E/AndroidRuntime(3731):  at java.lang.reflect.Method.invoke(Method.java:515) 
    09-22 18:30:49.053: E/AndroidRuntime(3731):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
    09-22 18:30:49.053: E/AndroidRuntime(3731):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
    09-22 18:30:49.053: E/AndroidRuntime(3731):  at dalvik.system.NativeStart.main(Native Method) 

我行410是如下:

mUserActivityTitleNameRetrieved2 = (TextView) getActivity().findViewById(R.id.tactivityname2); 

如果你需要任何澄清,讓我知道。 在此先感謝

+0

可能意味着getActivity()的結果返回null – ControlAltDel 2014-09-22 18:47:19

+0

看來getActivity()返回null。 – 2014-09-22 18:49:20

+0

感謝您的回覆。會使用getView更好嗎? – John 2014-09-22 18:53:44

回答

1

這是因爲getActivity()正在返回null。您沒有給出第410行的上下文,但是我懷疑它是在調用onDetach()之後的onAttach()之前執行的方法。查看關於handling the fragment生命週期的文檔,獲取有關何時可以依賴getActivity()返回非null值的更多信息。

請注意,如果您要訪問活動的視圖層次結構,則不應執行行410,直到調用onActivityCreated()

EDIT從堆棧跟蹤中可以看出,在某種解析操作完成後,在調用回調Runnable期間正在執行410行。我的猜測是解析是在後臺線程中完成的,當它完成後,它會發佈一個Runnable以在事件(UI)線程上執行。如果是這樣,那麼這個Runnable將在遇到它時立即執行,無論分片生命週期中是否發生了什麼。特別是,沒有什麼可以阻止解析完成,並且在調用onActivityCreated()(或甚至onAttach())之前執行Runnable

如果是這種情況,那麼您需要某種機制來安排事情在正確的時間發生。一種可能性是在調用onActivityCreated時在片段中設置一個標誌。然後,只有在設置了標誌的情況下才安排回撥。如果未設置,則將Runnable存儲在片段內的變量中。然後返回並修改onActivityCreated以檢查設置標誌時是否存在Runnable。這很麻煩,但我遇到了這樣的問題,這是我找到的最好的解決方案。

+0

感謝您的及時回覆。會使用getView而不是getActivity會更好嗎? – John 2014-09-22 18:52:02

+0

@ user3907211 - 同樣的原則適用。在'onCreateView()'返回之前,您不應該調用'getView()'。請注意,根據文檔,'onCreateView()'在onAttach()'返回之後纔會被調用。如果您解釋在代碼的生命週期中執行此代碼的時間,我們可以提供更多幫助。 – 2014-09-22 18:53:56

+0

在這種情況下,它是在onActivityCreated下調用的,它在onCreateView之前,所以應該在oncreateview之後移動onActivitycreate? – John 2014-09-22 18:57:22

0

我會在調用findViewById()之前檢查getActivity()是否返回null。否則,您將在運行時得到NullPointerException。

相關問題