2011-01-20 68 views
0

我的项目是我需要等待后台操作才能完成的地方。到那时,会显示一个进度对话框。现在,操作完成后,结果将存储在List中并且应该创建一个列表。等待给我一个Android错误

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

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()不返回。它只处于等待状态。所以你可以帮我出去做!

非常感谢!

问候 尼西

+0

你真的需要一个同步块吗? – gulbrandr 2011-01-20 18:07:40

+0

我试过删除同步声明。它给出了一个错误,在等待之前对象没有被锁定 – nithinreddy 2011-01-21 09:46:16

回答

0

如果要显示一个进度对话框,然后;希望你从后台进程发送进度通知到进度对话框,以便“进度对话框”不是“我是一个傻子,所以我实际上不会显示进度”对话框。后台进程发送“我已完成”通知。

0

等待需要同步以避免您看到的问题。解决您的问题的方法是使用标志以及wait()和notify()调用。同步等待操作完成应该是这个样子:

boolean done = false; 

... 

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

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

如果没有标志,则有可能为notifyAll的()被调用之前 wait()的是,在这点你最终等到永远。需要同步的块来确保在检查完成和调用wait()之间不发生通知。 Java对象如果不存在的原因是因为语言设计者试图巧妙地提醒你这种系统通常是必需的。

编辑添加:在Android中,对于大多数用途而言,AsyncTask类完全没有这种做法的麻烦。尽可能使用它。