2

私のアプリケーションでは、webview と通常の Android アプリケーションの両方に表示されるカスタマイズされたダイアログ ボックスを 1 つ作成しました。また、ダイアログ ボックスが表示されたときにバックグラウンド操作を行っています。また、いくつかの値を返します。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) {

                    }



            }
        };
4

1 に答える 1

1

synchronizedブロックに入るとのロックmydialog()を取得しますthis。このsynchronizedブロック内では、UI スレッドで実行し、 のブロックに入ったときに のロックを再度ShowDialog()取得しようとします。thissynchronizedShowDialog

ロックはすでに取得されているため、 で解放されるまで待機mydialog()ShowDialogますsynchronized(this)。あなたが持っているのはデッドロックです。

于 2013-03-06T13:37:48.193 に答える