Предположим, вы находитесь внутри фрагмента и делаете getActrivity().runOnUIThread(...)
в своем коде интерфейса Javascript. Возможно, что к тому моменту, когда WebViewCoreThread выполнит код интерфейса Javascript, фрагмент отсоединится от действия, и getActivity () вернет значение null, что приведет к созданию исключения NullPointerException. Безопасный способ сделать это - использовать обработчик, как в примере ниже. Кроме того, убедитесь, что интерфейс JavaScript использует WeakReferences для компонентов пользовательского интерфейса, если они должны быть подвергнуты сборке мусора перед выполнением интерфейса Javascript.
myWebView.addJavascriptInterface(new Object() {
private Handler handler = new Handler();
private WeakReference<ProgressBar> progressBarRef = new WeakReference<ProgressBar>(
myWebViewProgressBar);
private WeakReference<WebView> myWebViewRef = new WeakReference<WebView>(
myWebView);
@SuppressWarnings("unused")
public void onFirstImageLoad() {
handler.post(new Runnable() {
@Override
public void run() {
ProgressBar progressBar = progressBarRef.get();
WebView webView = myWebViewRef.get();
if (progressBar != null) {
progressBar.setVisibility(View.GONE);
}
if (webView != null) {
webView .setVisibility(View.VISIBLE);
}
}
});
}
}, "jsInterface");