Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:UI线程被阻止_Java_Android_Multithreading_Android Intent - Fatal编程技术网

Java Android:UI线程被阻止

Java Android:UI线程被阻止,java,android,multithreading,android-intent,Java,Android,Multithreading,Android Intent,在我的应用程序中,我创建了一个自定义对话框,它在webview和普通android应用程序中都会显示,并且当对话框显示时,我会执行一些后台操作,当我调用mydialog函数时,它会显示我的自定义对话框,并返回一些值,当我使用webview+javainterface时,它可以完美地工作,但它不适用于普通应用程序,流程是 首先我会得到我的对话框,在我做了一些处理之后(这里主线程会等待,对话框需要显示),然后我会返回字符串,问题是当我调用这个函数时对话框没有显示,而不是在后台处理完成后对话框会显示

在我的应用程序中,我创建了一个自定义对话框,它在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()
是静态的吗?使用干净的代码更容易看到发生了什么。也试着多发一些,这样就有了更多的上下文(没有双关语)