我有一个应用程序,正在尝试在Webview中注入JavaScript。 JS非常复杂且非常长,将它完全注入到webview中需要花费时间。到目前为止,我已经尝试了5秒钟的时间,然后才删除Webview顶部的覆盖层,但这似乎不起作用。
如果能以某种方式知道我的JS已完全注入并且网页已准备好对用户可见,那将是非常好的。
有什么办法吗?
到目前为止,我已经尝试过:
private class MyWebClient extends WebViewClient {
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
}
@Override
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
CommonUtility.createSSLErrorDialog(mRootActivity, handler);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return false;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
@Override
public void onPageFinished(WebView view, String url) {
injectJs();
super.onPageFinished(view, url);
}
}
这是injectJS方法:
public void injectJs(){
if(AppManager.getConfig()!=null){
ConfigData configData = AppManager.getPrivateConfig.getConfig().GetPageData;
doInjections(configData.ScriptToInject, configData.Action, "onWebState", new Callback() {
@Override
public void completed(Object object) {
showWebView();
}
@Override
public void failure(int errCode, String message, String serviceEndpoint, String responseTime) {
}
@Override
public void onSessionFailure(boolean valid) {
}
});
}
}
这显示了webview:
public void showWebView(){
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mProgress.setVisibility(View.GONE);
mOverlay.setVisibility(View.GONE);
}
}, 5000);
}
有趣的是,我注意到的是:
当我以下面提到的这种方式实现shouldOverrideUrl方法时,它的效果很好,但是某些页面无法加载到网站中。
@TargetApi(Build.VERSION_CODES.N)
@Override
public boolean shouldOverrideUrlLoading(final WebView view, final WebResourceRequest request) {
view.loadUrl(request.getUrl().toString());
return true;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
和下面的方法可行,所有页面都可以工作,但是有一个延迟,所有页面都加载,但是JS需要时间,这是因为我不知道如何完成JS注入。
@TargetApi(Build.VERSION_CODES.N)
@Override
public boolean shouldOverrideUrlLoading(final WebView view, final WebResourceRequest request) {
return false;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return false;
}