2011-06-01 26 views
1

有一種方法可以從webview調用javascript函數,然後讓它調用Java中的方法返回結果。如How to get return value from javascript in webview of android?中所述從Javascript *可靠*返回值到Webview

現在,javascript函數可能會失敗(比如由於javascript文件中的錯字)。在這種情況下,我想在Java中執行一些故障轉移代碼。什麼是這樣做的好方法?

我當前的代碼如下所示:

在Java:

private boolean eventHandled = false; 
    @Override 
    public void onEvent() { 
     eventHandled = false; 
     webview.loadUrl("javascript:handleEvent()"); 

     // Wait for JS to handle the event. 
     try { 
      Thread.sleep(500); // milliseconds 
     } catch (InterruptedException e) { 
      // log 
     } 

     if (!eventHandled) { 
      // run failover code here. 
     } 
    } 
    public final MyActivity activity = this; 
    public class EventManager { 
     // This annotation is required in Jelly Bean and later: 
     @JavascriptInterface 
     public void setEventHandled() { 
      eventHandled = true; 
     } 
    }; 

webview.addJavascriptInterface(new EventManager(), "eventManager"); 

在javascript中:

function handleEvent() { 
    var success = doSomething(); 
    if (success) { 
     eventManager.setEventHandled(); 
    } 
} 

這似乎對我的情況很好地工作。有沒有更好的辦法比這個「睡一會兒,並希望Javascript通話完成了」的方法?

回答

5

您可以使用同步對象通知和等待:

public class EventManager { 
    private final ConditionVariable eventHandled = new ConditionVariable();  

    public void setEventHandled() { 
     eventHandled.open(); 
    } 

    void waitForEvent() { 
     eventHandled.block(); 
    } 
} 

private final EventManager eventManager = new EventManager(); 

@Override 
public void onEvent() { 
    webview.loadUrl("javascript:handleEvent()"); 

    // Wait for JS to handle the event. 
    eventManager.waitForEvent(); 
}  
+0

如果javascript函數失敗並setEventHandled()不會被調用,我要運行一些故障代碼(如圖問題)。這個回答只會阻止等待javascript調用成功,不是? – tarkeshwar 2011-06-01 19:03:21

+1

超時使用'block'方法。 – Michael 2011-06-01 19:07:54