Android:UI线程被阻止

时间:2013-03-06 12:55:57

标签: 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) {

                    }



            }
        };

1 个答案:

答案 0 :(得分:1)

当您在synchronized中输入mydialog()块时,您获得了this的锁定。在此synchronized块中,您在UI线程上运行ShowDialog(),并在this中输入synchronized块后再次尝试获取ShowDialog锁定。

由于已经获得了锁定,因此它将一直等到mydialog()中的锁定,这将永远不会发生,因为ShowDialog永远不会执行synchronized(this)。你所拥有的是僵局。