在 AsyncTask 中使用回调函数时出现 NullpointerException
Posted
技术标签:
【中文标题】在 AsyncTask 中使用回调函数时出现 NullpointerException【英文标题】:NullpointerException when using callback function in AsyncTask 【发布时间】:2012-04-24 15:14:02 【问题描述】:有 2 个类和 1 个接口:类 1 = LoginPage,类 2 = SyncData 和接口 = AsyncTaskCompleteListener。
Class 1 使用 Class 2 与服务器同步信息。 Class 2 在 onPostExecute 方法中发布结果信息后,将使用 Interface 回调方法将结果信息发送给 Class 1。当我尝试使用回调方法时,我看到以下错误:
04-12 11:06:43.715: W/dalvikvm(24941): threadid=1: thread exiting with uncaught exception (group=0x4001e578)
04-12 11:06:43.720: E/androidRuntime(24941): FATAL EXCEPTION: main
04-12 11:06:43.720: E/AndroidRuntime(24941): java.lang.NullPointerException
04-12 11:06:43.720: E/AndroidRuntime(24941): at com.on_d_mand.live_evenementen.SyncData.onPostExecute(SyncData.java:101)
04-12 11:06:43.720: E/AndroidRuntime(24941): at com.on_d_mand.live_evenementen.SyncData.onPostExecute(SyncData.java:1)
04-12 11:06:43.720: E/AndroidRuntime(24941): at android.os.AsyncTask.finish(AsyncTask.java:417)
04-12 11:06:43.720: E/AndroidRuntime(24941): at android.os.AsyncTask.access$300(AsyncTask.java:127)
04-12 11:06:43.720: E/AndroidRuntime(24941): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
04-12 11:06:43.720: E/AndroidRuntime(24941): at android.os.Handler.dispatchMessage(Handler.java:99)
04-12 11:06:43.720: E/AndroidRuntime(24941): at android.os.Looper.loop(Looper.java:130)
04-12 11:06:43.720: E/AndroidRuntime(24941): at android.app.ActivityThread.main(ActivityThread.java:3691)
04-12 11:06:43.720: E/AndroidRuntime(24941): at java.lang.reflect.Method.invokeNative(Native Method)
04-12 11:06:43.720: E/AndroidRuntime(24941): at java.lang.reflect.Method.invoke(Method.java:507)
04-12 11:06:43.720: E/AndroidRuntime(24941): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
04-12 11:06:43.720: E/AndroidRuntime(24941): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670)
04-12 11:06:43.720: E/AndroidRuntime(24941): at dalvik.system.NativeStart.main(Native Method)
Class 1 onTaskComplete 方法示例:
public void onTaskComplete(String result)
//perform action after receiving the information
Toast.makeText(this, result, Toast.LENGTH_LONG).show();
Class 2 onPostExecute 方法示例:
public void onPostExecute(String RESULT)
if(dialog.isShowing())
dialog.dismiss();
callback.onTaskComplete(RESULT);
第 3 类:
package com.on_d_mand.live_evenementen;
public interface AsyncTaskCompleteListener<T>
public void onTaskComplete(T result);
有谁知道我在这里做错了什么?我希望类和接口不要太复杂。
编辑
解决这个问题的方法是在 Class 2 构造函数中初始化回调对象。
【问题讨论】:
你能把你初始化AsyncTask的'callback'字段的代码贴出来吗?我怀疑这要么没有完成,要么完成得太晚(例如在任务开始执行之后)。 由于某种原因我无法初始化回调。当我尝试初始化它时,我看到以下错误消息:无法实例化类型 AsyncTaskCompleteListener您需要在创建“SyncData”类时将引用传递给实现侦听器的对象。据推测,目前您的 LoginPage 中的内容如下所示:
new SyncData().execute();
您需要将其更改为:
new SyncData(this).execute();
并为 SyncData 添加一个构造函数:
public SyncData(AsyncTaskCompleteListener<String> callback)
this.callback = callback;
如果您已经有 SyncData 的构造函数,则需要将参数和代码添加到现有构造函数中。
【讨论】:
非常感谢!我不知道如何初始化它......这真是太愚蠢了,但你的代码有帮助! 我也是 Java 新手,想知道回调如何知道它应该触发哪个 onTaskComplete 方法。关于 AsyncTasks 和侦听器还有其他不好的答案,但这条信息丢失了 ***.com/questions/3291490/…。现在,当我再次查看时。信息也在那个答案中。我的阅读很差。【参考方案2】:你的对话对象有可能得到null
所以
而是
if(dialog.isShowing())
dialog.dismiss();
试试
if(dialog!=null)
dialog.dismiss();
【讨论】:
不,这没有帮助。它必须是回调方法。【参考方案3】: public void onPostExecute(String RESULT)
if(dialog.isShowing())
dialog.dismiss();
callback.onTaskComplete(RESULT); //make sure callback is not null
// and proper null check is required in onTaskComplete in case RESULT is null
【讨论】:
我无法初始化回调。我试过了: callback = new AsyncTaskCompleteListener对话框为空或回调为空。
看看行号,你就知道是哪一行了。
【讨论】:
【参考方案5】:试试这个代码:::
public void onTaskComplete(String result)
runOnUiThread(new Runnable()
public void run()
// TODO Auto-generated method stub
//perform action after receiving the information
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
);
【讨论】:
这不是我想要的,我需要使用回调接口继续我想要的。 :)以上是关于在 AsyncTask 中使用回调函数时出现 NullpointerException的主要内容,如果未能解决你的问题,请参考以下文章
Android:当我使用 AsyncTask 时出现“调用线程必须是准备好的 Looper 线程”错误
Android:尝试通过 AsyncTask 加载 videoview 时出现 NullPointerException [重复]
将记录插入 phpmyadmin 时出现 Asynctask 错误
从 Fragment 内的 AsyncTask 重新启动 Loader (SQLite) 时出现 IllegalStateException