如何知道何时将Javascript完全注入android webview中

时间:2018-06-28 17:59:01

标签: javascript android webview

我有一个应用程序,正在尝试在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;
}

0 个答案:

没有答案