【问题标题】:onPageFinished/onPageStarted in WebViewClient is never called永远不会调用 WebViewClient 中的 onPageFinished/onPageStarted
【发布时间】:2014-08-26 20:21:29
【问题描述】:

我正在为 Android 编写一个小 Web 应用程序,我需要从 HTML 页面获取一些 JS 变量,但 setParam(final String str) 中的代码从未被调用。

此外,onPageStarted(...) 和 onPageFinished(...) 中的代码也从未被调用过,我不知道为什么。

void startPageParse()
{
    WebView web = new WebView(context);

    web.getSettings().setJavaScriptEnabled(true);
    web.addJavascriptInterface(new Object(){
        @JavascriptInterface
        public void setParam(final String str)
        {
            setParamFromJS(str);
        }
    }, "JSInterface");

    web.setWebViewClient(new WebViewClient(){
        @Override
        public void onPageStarted(WebView view, String url, Bitmap fav)
        {
            super.onPageStarted(view, url, fav);

            Log.v("WebCLI", "Started");
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);

            view.loadUrl("javascript:JSInterface.setParam(flashvars['pl'])");

            Log.v("WebCLI", "JSCalled");
        }
    });

    web.loadUrl(SeasonURL);
    Log.v("WebCLI", "Load called");
}

如果我在“web.loadUrl(SeasonURL)”处设置断点,它可以工作(!)并且这些行将在 logcat 中:

08-28 13:22:12.766    4294-4294/shirokovoi.ChromeCastSSApp W/chromium﹕ [WARNING:jni_string.cc(28)] ConvertJavaStringToUTF8 called with null string.
08-28 13:22:12.875    4294-4356/shirokovoi.ChromeCastSSApp W/chromium﹕ [WARNING:proxy_service.cc(890)] PAC support disabled because there is no system implementation
08-28 13:22:15.290    4294-4294/shirokovoi.ChromeCastSSApp V/WebCLI﹕ Load called
08-28 13:22:15.610    4294-4294/shirokovoi.ChromeCastSSApp I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@425157a8 time:786230
08-28 13:22:15.625    4294-4294/shirokovoi.ChromeCastSSApp V/WebCLI﹕ Started
08-28 13:22:20.586    4294-4294/shirokovoi.ChromeCastSSApp V/WebCLI﹕ Uncaught SyntaxError: Unexpected identifier
08-28 13:22:20.586    4294-4294/shirokovoi.ChromeCastSSApp I/chromium﹕ [INFO:CONSOLE(1)] "Uncaught SyntaxError: Unexpected identifier", source: %SOMEURL% (1)
08-28 13:22:24.469    4294-4294/shirokovoi.ChromeCastSSApp V/WebCLI﹕ JSCalled

如果此活动作为主要活动,这也有效。

【问题讨论】:

  • 第一个问题:INTERNET 在清单中授予权限?
  • 是的,INTERNET 和 ACCESS_NETWORK_STATE 在清单中被授予
  • 你什么时候打电话给startPageParse
  • 在构造方法中
  • 我想我需要看一些日志然后什么的......如果你在onCreate中调用这个方法,context确实是Activity,你有适当的权限,SeasonURL 解析为 200 状态,那么我看到的唯一缺陷是 javascript 调用,但可以在您能够加载页面后解决。

标签: android webview webviewclient


【解决方案1】:

对于 JavaScript 调用,您需要对 KitKat 及其他版本使用不同的方法。特别是evaluateJavaScript()。通常我会extend WebView 并在 WebView 中实现这个方法,但是如果你在正确的线程上运行它,这个修改后的方法应该可以工作。下面是一个您可以调用的方法来适应新旧 javascript 调用:

public void injectJavaScript(WebView view, final String javascript) {

    if (javascript == null || javascript.isEmpty() || !this.isPageFinished) {
        return;
    }

    // As of KitKat, evaluateJavascript(String javascript) should be used over loadAd("javascript:(javaScriptMethod())")
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {

        String js = "javascript:" + javascript;
        view.loadUrl(js);
    } else {
        // Returns the value of the executed JavaScript as a JSON string.
        view.evaluateJavascript(javascript, new ValueCallback<String>() {
            @TargetApi(Build.VERSION_CODES.HONEYCOMB)
            @Override
            public void onReceiveValue(String stringCallback) {
                //If you'd like any response from the JS to confirm the execution
            }
        });
    }
}

因此,您在 onPageFinished() 中调用 JS 的位置将类似于:

@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);

    String jsString = "JSInterface.setParam(flashvars['pl']);";
    injectJavaScript(view, jsString);

    Log.v("WebCLI", "JSCalled");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2014-11-01
    相关资源
    最近更新 更多