使用Listener完成AsyncTask时的触发事件

Kur*_*ngu 5 android listener android-asynctask

我对如何使用Listeners在类和活动之间传递信息感到困惑.

方案是这样的:
我有一个任务,从Sqlite数据库读取数据,并将此数据放入一个ArrayList,传递给适配器,然后在屏幕上显示它.

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

细节:
我通过一个名为DatbaseRoutines的类完成数据库处理,并在其中执行繁重的内部方法.该方法使用AsyncTask,以免占用主线程.

我用单一方法创建和接口

 public interface DatabaseProcessListener {
  public void ProcessingIsDone(boolean blnProcessIsFinished);
} 
Run Code Online (Sandbox Code Playgroud)

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

private DatabaseProcessListener dbProcesslistener;
Run Code Online (Sandbox Code Playgroud)

以及它的二传手

   public void setDbProcesslistener(DatabaseProcessListener dbProcesslistener) {
    this.dbProcesslistener = dbProcesslistener;
    }
Run Code Online (Sandbox Code Playgroud)

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

            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);
                   } ;
Run Code Online (Sandbox Code Playgroud)

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

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;
     }
}
Run Code Online (Sandbox Code Playgroud)

经过一番挖掘后,我发现了logcat错误..一个nullpointer异常

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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,应用程序挂起,界面永远不会更新显示数据为真的活动(即处理已完成)

请指出我正确的方向.- 谢谢

Kur*_*ngu 3

得到答案了!我没有在调用类中初始化侦听器。我所需要做的就是放入这一行

db.setDbProcesslistener(this);
Run Code Online (Sandbox Code Playgroud)

IE

DatabaseRoutines db = new DatabaseRoutines(MyActivity.this);
db.setDbProcesslistener(MyActivity.this);
Run Code Online (Sandbox Code Playgroud)

它开始起作用了。

感谢所有看过并尝试想出解决方案的人:)