Java 在AsyncTask中使用回调函数时出现NullpointerException

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

有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=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;
 }