onPageFinished / onPageStarted在WebViewClient不会被调用 [英] onPageFinished/onPageStarted in WebViewClient is never called

查看:5661
本文介绍了onPageFinished / onPageStarted在WebViewClient不会被调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我为Android编写一个小的Web应用程序,我需要从HTML网页一些JS变量,但在setParam(最终字符串str)code永远不会被调用。

I am writing a little web application for Android and I need to get some JS variables from HTML page, but code in setParam(final String str) is never called.

此外,code在onPageStarted(...)和onPageFinished(...)不会被调用过了,我不能想为什么。

Also, code in onPageStarted(...) and onPageFinished(...) is never called too, and I can't suppose why.

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中(!):

If I set breakpoint at "web.loadUrl(SeasonURL)" it works(!) and those lines will be in 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

这也是如果此活动为主要工作。

This also work if this activity as main.

推荐答案

有关的JavaScript调用,你要使用的奇巧和超越不同的方法。具体来说 evaluateJavaScript()。通常我会扩展的WebView 和实施的WebView内这种方法,但如果你正确的线程上运行该改进的方法应该工作。下面是你可以调用容纳新老的JavaScript调用的方法:

For the JavaScript calls, you'll want to use a different method for KitKat and beyond. Specifically evaluateJavaScript(). Normally I would extend WebView and implement this method within the WebView, but this modified method should work if you run it on the right thread. Below is a method that you can call that accommodates the new and old javascript calls:

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
            }
        });
    }
}

所以,你在哪里调用JS在你的 onPageFinished()它看起来是这样的:

@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");
}

这篇关于onPageFinished / onPageStarted在WebViewClient不会被调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆