2013-03-06 166 views
1

在我的应用程序中,我创建了一个自定义的对话框,它显示在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) { 

        } 



      } 
     }; 
+0

你见过代码是否曾经退出while循环?你可以把一些'Log.d(“DIALOG”,“代码已达到点x”);在代码中的语句来看看发生了什么?我会说使用'while'循环并不是一个好主意 - 你最好使用类似'Handler'的东西,一旦对话准备好就可以发送消息。 – 2013-03-06 13:48:56

+0

@AndrewWyld,我尝试了所有方法,没有什么wokrs所以finallly我来,而德路,但它wokrks细跟的WebView,Browser.addJavascriptInterface(新MyClass的(这一点), \t \t \t“AndroidFunction”);,然后我打电话mydialog在javascript,它显示我的对话框,并返回值为javascript – 2013-03-06 13:55:06

回答

1

我称之为我的对话框等等。在此​​块内,您在UI线程上运行ShowDialog(),并在ShowDialog中输入​​块时尝试再次获取this的锁。

由于锁已被获取,因此它将一直等到它在mydialog()中发布,因为ShowDialog永远不会执行过synchronized(this)。你有什么是僵局。

+0

:即使我尝试没有同步,也不工作 – 2013-03-06 13:41:04

+0

它可能是在你的'while(customizeddialog.Get value()== null)'循环,'customizeddialog.Getvalue ()'不返回null,对话框还没有显示。 – Eliezer 2013-03-06 17:02:33

+0

雅同意你,但我需要从该对话框的价值,所以我把原因放在一边,但我在uithread中显示的对话框,也我把这个循环在主线程,这种方法工作正常,当我从webview呼叫 – 2013-03-07 05:17:51