android - 使用 Listener 在 AsyncTask 完成时触发事件

标签 android android-asynctask listener

我对如何使用监听器在类和 Activity 之间传递信息有些困惑。

场景是这样的:
我的任务是从 Sqlite 数据库中读取数据并将这些数据放入一个 ArrayList 中,该 ArrayList 被传递给 Adapter,然后将其显示在屏幕上。

问题:
当我尝试使用值更新监听器界面时,我的应用程序崩溃了。它没有在 logcat 中显示任何内容……它只是挂起应用程序。 有人可以指出我要去哪里错了。 - 谢谢

详情:
我有一个名为 DatbaseRoutines 的类完成数据库处理,并在其中使用一个内部方法来完成繁重的工作。该方法使用 AsyncTask 以免占用主线程。

我用一个方法创建了接口(interface)

 public interface DatabaseProcessListener {
  public void ProcessingIsDone(boolean blnProcessIsFinished);
} 

在我的 DatabaseRoutines 类中,我正在创建一个私有(private)变量

private DatabaseProcessListener dbProcesslistener;

连同它的二传手

   public void setDbProcesslistener(DatabaseProcessListener dbProcesslistener) {
    this.dbProcesslistener = dbProcesslistener;
    }

处理完成后,我使用 PostExecute 方法更新监听器,以便将监听器中的值更改为 True(即数据库处理完成) 下面是代码

            protected void onPostExecute(Boolean aBoolean) {
                super.onPostExecute(aBoolean);
                dialog.dismiss(); //i have progress dialog during processing and its                        
                //closed here

                if (blnUpdateSucceededStatus) 
                 {
                     dbProcesslistener.ProcessingIsDone(true);
                  } 
                   else 
                  {
                    Toast.makeText(ctx, "Transactions Processing   
                     failed",Toast.LENGTH_SHORT);
                   } ;

最后,在显示从数据库收集的数据的 Activity 中,我实现了监听器。见下文。

public class MyActivity extends Activity implements DatabaseProcessListener 
{

@Override
public void ProcessingIsDone(boolean blnProcessIsFinished) {
    if(blnProcessIsFinished){
        PopulateExpandableListView();
    }
   public void PopulateExpandableListView() {
   //code for populating the listview goes here;
     }
}

经过一些挖掘我发现了 logcat 错误..它是一个空指针异常

05-05 11:11:18.590: ERROR/AndroidRuntime(22339): FATAL EXCEPTION: main
    java.lang.NullPointerException
    at com.example.mledger.DatabaseRoutines$1.onPostExecute(DatabaseRoutines.java:258)
    at com.example.mledger.DatabaseRoutines$1.onPostExecute(DatabaseRoutines.java:141)
    at android.os.AsyncTask.finish(AsyncTask.java:631)
    at android.os.AsyncTask.access$600(AsyncTask.java:177)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4921)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
    at dalvik.system.NativeStart.main(Native Method)

不幸的是应用程序挂了,界面永远不会更新显示数据的 Activity 为 true(即处理完成)

一定要给我指出正确的方向。 - 谢谢

最佳答案

听起来 dbProcesslistener 变量是 NULL。在调用 dbProcesslistener.ProcessingIsDone(true); 之前,您是否调用了 setter 并将初始化的 Listener 对象传递给它?

关于android - 使用 Listener 在 AsyncTask 完成时触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16374445/

相关文章:

android - 上传文件时 MultipartEntityBuilder 中出现 NoClassDefFoundError

android - 创建循环后台任务

java - 将对象添加到数组

android - 创建样式-v21.xml

Android asynctask自定义适配器在错误位置加载图像

javascript - 将 HTML 表格点击事件与 Javascript 关联

javascript - 您可以在 Android Chrome 上为 matchMedia 添加一个 javascript 回调监听器吗?

c# - 具有 HTTPListener 的 Win7 服务在一个请求后停止响应

java - Ant 不会在 libs 文件夹中找到类

java - 来自第二个 Activity 的 Android Asynctask