回调中的 class.this 怎么可以为空?

How can class.this in a callback can be null?

我有一个片段。在此片段中,我 运行 对 json-rpc 的 http 请求。为了处理结果,我的回调中有这样的东西。

FragmentClass.this.getActivity().runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // Do something
    } 
});

问题是,有时我会在第一行收到 NullPointerException ......我的第一个意图是,片段分离得很快可能是因为用户在请求 运行s所以

FragmentClass.this.getActivity();

没有 activity 和 returns 空值。 我用这样的 if 将整个内容括起来:

// New if:
if (FragmentClass.this.getActivity() != null) {

    FragmentClass.this.getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
            // Do something
        } 
    });

}

但是……什么都没有……现在我在 if 语句上得到了 NullPointerException。似乎

FragmentClass.this

为空。

这怎么可能。我认为一个实例将被保留,直到没有代码部分需要它并且 gc 收集它...

这是 logcat 给我的堆栈跟踪。我已经更改了包名和类名。第192行是if语句的行。

09-18 10:49:36.915    3860-3860/de.unkown.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at de.unkown.app.camera.#FragmentClass.onError(FragmentClass.java:192)
            at de.unkown.app.webservice.JsonRpcService.onError(JsonRpcService.java:497)
            at    de.unkown.app.webservice.JsonRpcService$DefaultErrorListener.onErrorResponse(JsonRpcService.java:107)
                at com.android.volley.Request.deliverError(Request.java:577)
            at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:101)
            at android.os.Handler.handleCallback(Handler.java:725)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)

感谢您的帮助!

阿图尔

创建全局变量Context上下文;

比在 Create 方法中初始化变量:

上下文=获取Activity();

而不是将其用作:

context. runOnUiThread (new Runnable() {
    @Override
    public void run() {
        // Do something
    } 
});

希望这对您有所帮助。

好的,

我在所有异步块中更改了

FragmentClass.this.getActivity()

getActivity()

这对接缝有帮助。请不要问我为什么...我认为这应该是相同的...

getActivity() returns onCreateonCreateView 方法中的空值。
onViewCreated 中使用 getActivity()。最好使用带有检查的 getActivity 包围代码 - if (isAdded()) { }.

在您的情况下,您得到的是空值,因为在您调用 FragmentClass.this.getActivity() 时,您的片段不再对用户可见,实际上已经调用了 onStop。

进一步补充我的答案-
假设您正在对执行 AsyncTask 的片段调用方法 doSomething()。然后将 YourFragmentClass.this 作为方法参数传递给 doSomething(YourFragmentClass thiz) 并在 doInBackground()onPostExecute() 方法中使用此对象而不是使用 YourFragmentClass.this,因为 YourFragmentClass.this returns null,因为在 AsynTask 运行时,您的片段会移动到 onPause 或 onStop。