WebView を Javascript-Interpreter として使用したい。一部のライブラリが既に読み込まれているかどうかを確認するには、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() が呼び出されることはありません =>デッドロック。
しかし、ページが読み込まれるのを (メインスレッドで) 待機するための有効な方法はありますか?