【问题标题】:Trigger event when AsyncTask is complete using Listener使用 Listener 完成 AsyncTask 时触发事件
【发布时间】:2013-05-04 12:43:20
【问题描述】:

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

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

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

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

我已经用一个方法创建了接口

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

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

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);
                   } ;

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

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)

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

请为我指明正确的方向。 - 谢谢

【问题讨论】:

  • 您是否检查过 onPostExecute() 是否为您的 AsyncTask 调用。
  • 是的,我做到了。我放了一个断点,它只是冻结在调用侦听器的行上。谢谢

标签: android android-asynctask listener


【解决方案1】:

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

【讨论】:

  • 谢谢。这实际上是问题所在。我在调用之前没有初始化。
【解决方案2】:

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

db.setDbProcesslistener(this);

DatabaseRoutines db = new DatabaseRoutines(MyActivity.this);
db.setDbProcesslistener(MyActivity.this);

它开始工作了。

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

【讨论】:

  • @KuriaNdungu——感谢您发布有效的方法。也感谢你展示了足够多的代码,现在每个人都可以尝试应用这种技术。
  • 啊,伙计!!!!!!我所做的只是仔细地将@Kuria 代码的前 3 和第 5 块代码剪切并粘贴到我的应用程序中,并将我自己的 onPostExecute 修改为只有一行--dbProcesslistener.ProcessingIsDone(true); 然后我得到了 NPE,所以我醒来并粘贴了他的路线适合我的appdbc.setDbProcesslistener(this);,并且成功了。研究这个非常重要的技术示例。超级工作,库里亚!这是典型的 SO Q 和(用户的!)工作 A!
  • @DSlomer64 1) 为问题加注星标 2) 为 erythang 投票 3) 开始赏金并将其提供给 Kuria。
  • @Will--我昨天确实为这个问题加注了星标(作为最喜欢的,是吗?)并且除了一个之外都投了赞成票(也只是这样做了)但我不知道你的意思@ 987654327@。我将鼠标悬停在“开始赏金”上,看起来我可能会失去代表,这不是生与死,但是......我从来没有做过赏金(显然)。此外,开始赏金说“提供代表以获得更好的答案”。我认为没有比我们这里更好的答案了。所以我真的很困惑和/或错过了什么。没有反抗,只是迷茫。我该如何“把它交给 Kuria”?
  • 我刚读到这个:What is a bounty? How can I start one? If you’ve asked a good question, edited it with status and progress updates, and still are not receiving answers, you can draw attention to your question by placing a bounty on it. 这不属于那个类别,是吗?我喜欢我在这里找到的东西。堪称典范。所以我看不到为此付出 900 分中的 50 分。我还没有抓住重点吗?
猜你喜欢
  • 2013-01-08
  • 2020-09-12
  • 2015-10-16
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多