-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。

相关问题