Android:UI线程被阻止
在我的应用程序中,我创建了一个自定义的对话框,它显示在webview和普通的android应用程序中,并且我在显示对话框时做了一些后台操作,当我调用mydialog函数它显示我的自定义对话框,它也返回一些值,它是完美的工作,当我使用webview + javainterface,但它不适用于普通的应用程序,流程是Android:UI线程被阻止
首先我会得到我的对话,做一些过程(这里主线程将等待,对话框需要显示,)然后我将返回字符串,问题是对话框不显示时,我调用此函数,而不是对话框将显示后我的后台进程完成。当您在mydialog()
进入块你获得this
的锁
String sample=mydialog();
public String mydialog() {
String mystring = null;
try {
myactivity.this.runOnUiThread(ShowDialog);
while (customizeddialog.Getvalue() == null) {
}
mystring = customizeddialog.Getvalue();
customizeddialog.Setvalue(null);
} catch (Exception e) {
return mystring;
}
private Runnable ShowDialog = new Runnable() {
public void run() {
try {
customizeddialog m_dialog = new customizeddialog(myactivity.this);
m_dialog.setCancelable(false);
m_dialog.show();
} catch (Exception e) {
}
}
};
:
我称之为我的对话框等等。在此块内,您在UI线程上运行ShowDialog()
,并在ShowDialog
中输入块时尝试再次获取this
的锁。
由于锁已被获取,因此它将一直等到它在mydialog()
中发布,因为ShowDialog
永远不会执行过synchronized(this)
。你有什么是僵局。
:即使我尝试没有同步,也不工作 – 2013-03-06 13:41:04
它可能是在你的'while(customizeddialog.Get value()== null)'循环,'customizeddialog.Getvalue ()'不返回null,对话框还没有显示。 – Eliezer 2013-03-06 17:02:33
雅同意你,但我需要从该对话框的价值,所以我把原因放在一边,但我在uithread中显示的对话框,也我把这个循环在主线程,这种方法工作正常,当我从webview呼叫 – 2013-03-07 05:17:51
你见过代码是否曾经退出while循环?你可以把一些'Log.d(“DIALOG”,“代码已达到点x”);在代码中的语句来看看发生了什么?我会说使用'while'循环并不是一个好主意 - 你最好使用类似'Handler'的东西,一旦对话准备好就可以发送消息。 – 2013-03-06 13:48:56
@AndrewWyld,我尝试了所有方法,没有什么wokrs所以finallly我来,而德路,但它wokrks细跟的WebView,Browser.addJavascriptInterface(新MyClass的(这一点), \t \t \t“AndroidFunction”);,然后我打电话mydialog在javascript,它显示我的对话框,并返回值为javascript – 2013-03-06 13:55:06