Java 在AsyncTask中使用回调函数时出现NullpointerException
有2个类和1个接口:类1=LoginPage,类2=SyncData,接口=AsyncTaskCompleteListener 类1使用类2与服务器同步信息。类2在onPostExecute方法中发布结果信息后,将使用接口回调方法将结果信息发送给类1。当我尝试使用回调方法时,会看到以下错误:Java 在AsyncTask中使用回调函数时出现NullpointerException,java,android,callback,nullpointerexception,android-asynctask,Java,Android,Callback,Nullpointerexception,Android Asynctask,有2个类和1个接口:类1=LoginPage,类2=SyncData,接口=AsyncTaskCompleteListener 类1使用类2与服务器同步信息。类2在onPostExecute方法中发布结果信息后,将使用接口回调方法将结果信息发送给类1。当我尝试使用回调方法时,会看到以下错误: 04-12 11:06:43.715: W/dalvikvm(24941): threadid=1: thread exiting with uncaught exception (group=0x4001
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)
第1类onTaskComplete方法示例:
public void onTaskComplete(String result) {
//perform action after receiving the information
Toast.makeText(this, result, Toast.LENGTH_LONG).show();
}
public void onPostExecute(String RESULT) {
if(dialog.isShowing()){
dialog.dismiss();
}
callback.onTaskComplete(RESULT);
}
类2 onPostExecute方法示例:
public void onTaskComplete(String result) {
//perform action after receiving the information
Toast.makeText(this, result, Toast.LENGTH_LONG).show();
}
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);
}
package com.on\u d\u mand.live\u evenementen;
公共接口AsyncTaskCompleteListener{
已完成(T结果)的公开作废;
}
有人知道我做错了什么吗?我希望类和接口不会太复杂
编辑
此问题的解决方案是初始化Class 2构造函数中的回调对象。您的dialog对象可能会得到
null
so
反而
试一试
对话框为空或回调为空 看一下行号,你就会知道它是哪个。试试下面的代码::
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();
}
});
}
创建“SyncData”类时,需要将对实现侦听器的对象的引用传递给该类。据推测,目前在您的登录页面中,您有如下内容:
new SyncData().execute();
您需要将此更改为:
new SyncData(this).execute();
并向SyncData添加构造函数:
public SyncData(AsyncTaskCompleteListener<String> callback)
{
this.callback = callback;
}
公共同步数据(AsyncTaskCompleteListener回调)
{
this.callback=回调;
}
如果您已经有了SyncData的构造函数,则需要将参数和代码添加到现有的构造函数中。不,这没有帮助。它必须是回调方法。我不能初始化回调。我尝试过:callback=new AsyncTaskCompleteListener();但我明白了:不能实例化类型AsyncTaskCompleteListener@Xonarial .. AsyncTaskCompleteListener是类还是接口..?我在类1中实现了接口。我现在需要做什么?如果1班是一项活动,你做的事情不对。。但您可以在其他类中实现,然后使用新运算符创建实例并调用该方法。。您永远不能将new与接口一起使用,因为它没有构造函数。那么解决此问题的最佳方法是什么?你有什么建议吗?你能把代码贴在初始化异步任务的“回调”字段的地方吗?我怀疑这不是没有完成,就是做得太晚(例如,在任务开始执行之后)。出于某种原因,我无法初始化回调。当我尝试初始化它时,会看到以下错误消息:无法实例化AsyncTaskCompleteListener类型您可以发布尝试初始化它时使用的代码吗?我没有初始化我的接口。我该怎么办?这就是它的样子。AsyncTaskCompleteListener回调;这不是我想要的,我需要使用回调接口继续我想要的。:)非常感谢你!我不知道如何初始化它。。。我真是太蠢了,但是你的代码帮了我的忙!我也是Java新手,想知道回调如何知道应该触发哪个onTaskComplete方法。关于异步任务和侦听器还有另外一个很好的答案,但缺少这条信息。现在当我再看一遍的时候。答案中也有相关信息。我读得不好。
public SyncData(AsyncTaskCompleteListener<String> callback)
{
this.callback = callback;
}