回调中的 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 onCreate
和 onCreateView
方法中的空值。
在 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。
我有一个片段。在此片段中,我 运行 对 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 onCreate
和 onCreateView
方法中的空值。
在 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。