在 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 您可以发布您尝试初始化时使用的代码吗? 我没有初始化我的界面。我该怎么办?这就是它的外观。 AsyncTaskCompleteListener 回调; 【参考方案1】:

您需要在创建“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();但我看到:无法实例化类型 AsyncTaskCompleteListener @Xonarial .. 是 AsyncTaskCompleteListener 类还是接口..? 我确实在Class 1中实现了接口,我现在需要做什么? 如果 Class1 是一个 Activity 你没有做正确的事情.. 但是你可以在其他一些类中实现然后使用 new 运算符创建实例并调用该方法..您永远不能将 new 与接口一起使用,因为它没有构造函数.. 那么解决这个问题的最佳方法是什么?你有什么建议?【参考方案4】:

对话框为空或回调为空。

看看行号,你就知道是哪一行了。

【讨论】:

【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章

从 finally 块调用回调函数时出现问题

Android:当我使用 AsyncTask 时出现“调用线程必须是准备好的 Looper 线程”错误

Android:尝试通过 AsyncTask 加载 videoview 时出现 NullPointerException [重复]

将记录插入 phpmyadmin 时出现 Asynctask 错误

从 Fragment 内的 AsyncTask 重新启动 Loader (SQLite) 时出现 IllegalStateException

尝试编译函数时出现语法错误