首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NullpointerException在AsyncTask中使用回调函数时

NullpointerException在AsyncTask中使用回调函数时
EN

Stack Overflow用户
提问于 2012-04-12 09:20:59
回答 5查看 4.3K关注 0票数 2

有两个类和一个接口:类1= LoginPage,类2= SyncData和接口= AsyncTaskCompleteListener。

第1类使用类2与服务器同步信息。在Class 2在onPostExecute方法中发布结果信息后,将使用接口回调方法将结果信息发送到第1类。当我尝试使用回调方法时,将看到以下错误:

代码语言:javascript
复制
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方法示例:

代码语言:javascript
复制
public void onTaskComplete(String result) {
    //perform action after receiving the information
    Toast.makeText(this, result, Toast.LENGTH_LONG).show(); 
}

第2类onPostExecute方法示例:

代码语言:javascript
复制
public void onPostExecute(String RESULT) {

    if(dialog.isShowing()){
        dialog.dismiss();
    }

    callback.onTaskComplete(RESULT);

}

第3类:

代码语言:javascript
复制
package com.on_d_mand.live_evenementen;

public interface AsyncTaskCompleteListener<T> {
    public void onTaskComplete(T result);
}

有人知道我做错了什么吗?我希望它不是太复杂的类和接口。

编辑

这个问题的解决方案是初始化第2类构造器中的回调对象。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-04-12 09:52:07

创建“SyncData”类时,需要将对实现侦听器的对象的引用传递给它。想必,在您的LoginPage中,您可能会看到如下所示:

代码语言:javascript
复制
 new SyncData().execute();

您需要将其更改为:

代码语言:javascript
复制
 new SyncData(this).execute();

并向SyncData添加构造函数:

代码语言:javascript
复制
 public SyncData(AsyncTaskCompleteListener<String> callback)
 {
      this.callback = callback;
 }

如果已经有了SyncData的构造函数,则需要将参数和代码添加到现有的构造函数中。

票数 4
EN

Stack Overflow用户

发布于 2012-04-12 09:22:02

您的对话框对象可能获得null,所以

代码语言:javascript
复制
if(dialog.isShowing()){
        dialog.dismiss();

试一试

代码语言:javascript
复制
if(dialog!=null){
        dialog.dismiss();
票数 2
EN

Stack Overflow用户

发布于 2012-04-12 09:33:33

代码语言:javascript
复制
    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

    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10120791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档