等在Android中给我一个错误

时间:2011-01-20 17:29:13

标签: android wait

我的项目是在哪里,我必须等待,后台操作才能完成。然后,将显示进度对话框。现在,在操作完成后,结果将存储在List中,并且应该创建一个列表。

一切似乎工作正常(进度对话框和所有),但在wait()中,我的代码(在堆栈溢出中看到)是

    Runnable runnable = new Runnable() {
    public void run() {
      // wait(); This call wouldn't work
      synchronized (this) {
        wait();  // This call will work
      }
    }
};

在后台操作完成后,它是

public void handleMessage(android.os.Message msg) {
          super.handleMessage(msg);
             System.out.println("Doneee!!! Yup yes ");
          pd.dismiss();
         synchronized (runnable) {
        runnable.notifyAll(); // this call will work
       }
    }

但问题是,等待正在被绞死。我的意思是,当我也尝试调试时,wait()不会返回。它只处于等待状态。那么请你帮帮我吧!

提前多多感谢!

此致 尼西

2 个答案:

答案 0 :(得分:0)

如果您正在显示进度对话框,那么;希望您从后台进程向进度对话框发送进度通知,以便“进度对话框”不是“我是一个傻瓜,所以我实际上不会显示进度”对话框。让后台进程发送“我完成”通知。

答案 1 :(得分:0)

需要同步等待才能避免您遇到的问题。您的问题的解决方案是使用标志以及wait()和notify()调用。等待操作完成的同步应该如下所示:

boolean done = false;

...

synchronized(this) {
   if (!done) wait();
}

...
synchronized(this) {
   done = true;
   notifyAll();
}

如果你没有标志,那么在 wait()之前可以将notifyAll()称为,此时你将永远等待。需要同步块以确保在检查完成和调用wait()之间不会发生通知。 Java对象如果不存在则是因为语言设计者试图巧妙地提醒你这种系统通常是必要的。

编辑添加:在Android中,出于大多数目的,AsyncTask类可以解决所有这些问题。尽可能使用它。