我想使用 WebView 作为 Javascript 解释器。为了检查是否已经加载了一些库,我想使用在 WebViewClient 的 onPageFinished() 方法中倒计时的 CountDownLatch。它看起来像这样:
public JsInterpreter(Context context) {
interpreterWebView = new WebView(context);
interpreterWebView.getSettings().setJavaScriptEnabled(true);
interpreterWebView.setWebViewClient(new WebViewReadyListener());
webViewReadyCountDownLatch = new CountDownLatch(1);
interpreterWebView.loadUrl(/*javascriptLibrary*/);
}
public void javaScriptRequest(String request) {
webViewReadyCountDownLatch.await();
interpreterWebView.loadUrl( "javascript:" + request );
}
private class WebViewReadyListener extends WebViewClient {
@Override
public void onPageFinished (WebView view, String url) {
webViewReadyCountDownLatch.countDown();
}
}
首先,我认为这是一个好主意,因为像这样我可以等待库被加载,但是当我调用我的 javaScriptRequest() 方法时,我不需要处理侦听器。但是我忘记了 javaScriptRequest() 和 onPageFinished() 方法都在主线程上运行(在我的情况下),所以当我调用 await() 时线程停止运行并且 onPageFinished() 永远不会被调用 =>僵局。
但是是否有任何可行的方法来等待(在主线程上)加载页面?