Так я решаю проблемы, подобные вашей.
1) Создайте и свяжите JavascriptInterface с вашим WebView. JavascriptInterface - это просто класс, внутри которого вы можете объявить некоторый Java-метод, который вы хотите использовать из JS.
public class JSInterface() {
private final CountDownLatch latch = new CountDownLatch(1);
public void waitForProceed() {
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void canProceed() {
latch.countDown();
}
}
2) В AsyncTask в конце метода onPostExecute()
необходимо вызвать метод canProceed()
, чтобы уведомить JSInterface, что он может выйти из метода waitForProceed()
.
public class MyAsyncTask extends AsyncTask<.......> {
private JSInterface jsi;
... // other class property
public MyAsyncTask(JSInterface jsi) {
...
//do what you want with other class property
this.jsi = jsi;
}
@Override
public ... doInBackground(...) {
...
//do something
}
@Override
public void onPostExecute(...) {
...
//do something
jsi.canProceed();
}
}
3) В своей деятельности вы должны связать объект JSInterface с вашим WebView:
WebView mWebView;
...
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JSInterface(), "JSIface");
4) Наконец, в JS вы можете вызвать AsyncTask (я не знаю, как вы это называете, но я полагаю, вы используете что-то вроде JSInterface) и после вызова waitForProceed()
метод:
startAsyncTask(); //somehow
JSIface.waitForProceed();
Надеюсь, это решит вашу проблему;)