を使用することですあなたがフラグメント内であり、あなたがあなたのJavascriptのインタフェースコードでgetActrivity().runOnUIThread(...)
をやっていると仮定します。 WebViewCoreThreadがJavascriptインターフェイスコードを実行するときに、そのフラグメントはアクティビティから切り離され、getActivity()はnullを返し、結果としてNullPointerExceptionがスローされることがあります。これを行うための安全な方法は、以下の例のようにHandlerを使用することです。また、Javascriptインターフェイスが実行される前にガベージコレクションされる必要がある場合、JavaScriptインターフェイスがUIコンポーネントのWeakReferenceを使用するようにしてください。
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");
ありがとうございます!これはやったよ:) –
ハンドラにUIスレッドを使用させるには、 'new Handler(Looper.getMainLooper())'をいつでも実行できます。 – ImMathan