Java Android:UI线程被阻止
在我的应用程序中,我创建了一个自定义对话框,它在webview和普通android应用程序中都会显示,并且当对话框显示时,我会执行一些后台操作,当我调用mydialog函数时,它会显示我的自定义对话框,并返回一些值,当我使用webview+javainterface时,它可以完美地工作,但它不适用于普通应用程序,流程是 首先我会得到我的对话框,在我做了一些处理之后(这里主线程会等待,对话框需要显示),然后我会返回字符串,问题是当我调用这个函数时对话框没有显示,而不是在后台处理完成后对话框会显示 我将其称为我的对话框,如下所示:Java Android:UI线程被阻止,java,android,multithreading,android-intent,Java,Android,Multithreading,Android Intent,在我的应用程序中,我创建了一个自定义对话框,它在webview和普通android应用程序中都会显示,并且当对话框显示时,我会执行一些后台操作,当我调用mydialog函数时,它会显示我的自定义对话框,并返回一些值,当我使用webview+javainterface时,它可以完美地工作,但它不适用于普通应用程序,流程是 首先我会得到我的对话框,在我做了一些处理之后(这里主线程会等待,对话框需要显示),然后我会返回字符串,问题是当我调用这个函数时对话框没有显示,而不是在后台处理完成后对话框会显示
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) {
}
}
};
当您在
mydialog()
中输入synchronized
块时,您将获得此
的锁。在该synchronized
块中,您在UI线程上运行ShowDialog()
,并在ShowDialog
中输入synchronized
块时,再次尝试获取该块的锁
由于已获取锁,它将等待直到在mydialog()
中释放锁,这将永远不会发生,因为ShowDialog
从未执行过synchronized(this)
。您遇到的是死锁。您看到过代码在循环时是否退出该?你能不能把一些Log.d(“对话框”,“代码已经到达x点”)代码>代码中的语句以查看发生了什么?我想说,使用while
循环不是一个好主意。最好使用处理程序之类的东西,一旦对话框准备好,你就可以发送消息。@andrewyld,我尝试了所有方法都没有效果,所以最后我在looop时找到了它,但它在webview、Browser.addJavascriptInterface(新myclass)(这个),“AndroidFunction”);,然后我在javascript中调用mydialog,它显示我的对话框并将值返回到javascriptIt可能是在while(customizeddialog.Get value()==null)
循环中,customizeddialog.Getvalue()
没有返回null,对话框还没有显示。你同意,但我需要从该对话框中进行赋值,这样我就可以在uithread中显示对话框,并且在主线程中显示该循环,当我从WebView调用“customizeddialog”的类型是什么?这是一个单独的类,我使用set和get方法从您拥有的类中获取值myactivity.this.runOnUiThread(ShowDialog)
紧接着是while(customizeddialog.Getvalue()==null)
。如果第二条语句是在ShowDialog()
有机会运行之前运行的,该怎么办?customizeddialog
是否为空?如果不是,则Getvalue()
是否会返回null以外的值?我仍然对自定义对话框
感到困惑。它是一个类还是一个变量?因为在mydialog()
中调用customizeddialog.Getvalue()
。Getvalue()
是静态的吗?使用干净的代码更容易看到发生了什么。也试着多发一些,这样就有了更多的上下文(没有双关语)