Android WebView阻止评估

时间:2018-06-23 07:18:24

标签: android webview countdownlatch

我正在尝试在Webview中评估具有阻止功能的Javascript查询。含义函数线程正在等待结果。但是,在主线程上均调用了valuateJavascript和ValueCallback,并且主线程已暂停以等待结果,这意味着永远无法在等待状态下捕获结果。这是我的例子,

private String getFirstUser(){
    String evS = "document.getElementsByClassName(\"hm-user\")[0].innerHTML";
    final CountDownLatch cdl = new CountDownLatch(1);
    final StringBuilder sb = new StringBuilder();
    try{
        evaluateJavascript(evS, new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                if(value != null && value.length() != 0 && !value.equals("null")){
                    sb.append(value);
                }
                cdl.countDown();
            }
        });
        cdl.await(200, TimeUnit.MILLISECONDS);
    }catch (Exception e){};
    return sb.length() == 0 ? null : sb.toString();
}

会发生什么,直到等待被解除阻塞才发生回调,这意味着函数总是返回null?

我在做什么错?我已经将此用于http请求,并且有效。

编辑:我知道类似Android main thread blocking WebView thread的类似线程 但是,没有可用的解决方案。

1 个答案:

答案 0 :(得分:0)

由于调用onReceiveValue不会是同步的,因此会涉及阻塞主线程,以防您希望使其同步,因此建议您避免这样做。与其尝试将其实现为同步调用,不如实现回调并使它作为异步继续。

您可以通过以下方式实现它:

private void getFirstUser(final ValueCallback<String> valueCallback){
    String evS = "document.getElementsByClassName(\"hm-user\")[0].innerHTML";    
    final StringBuilder sb = new StringBuilder();
    try{
        evaluateJavascript(evS, valueCallback);
    }catch (Exception e){ 
        valueCallback.onReceiveValue(null);// You can pass any value instead of null.
    };

}

虽然调用方法只是这样做:

getFirstUser(new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                if(value != null && value.length() != 0 && !value.equals("null")){
                   //do something with proper value
                }else{
                  // take necessary action if value is null
                }

            }
        });