Предположим, что вы находитесь внутри фрагмента, и вы делаете getActrivity().runOnUIThread(...)
в коде Javascript интерфейса. Возможно, что к моменту, когда WebViewCoreThread выполнит код интерфейса Javascript, фрагмент будет отделен от активности, а getActivity() вернет null, в результате чего будет выведено исключение NullPointerException. Безопасный способ сделать это - использовать обработчик, как в приведенном ниже примере. Кроме того, убедитесь, что интерфейс JavaScript использует WeakReferences для компонентов ui, поскольку они должны быть собраны в мусор, прежде чем выполняется интерфейс 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");
Спасибо, много! Это сделало трюк :) –
Вы всегда можете использовать 'new Handler (Looper.getMainLooper())', чтобы обработчик использовал поток пользовательского интерфейса. – ImMathan