Javascript在WebView中调用Android方法

时间:2015-04-30 07:47:29

标签: javascript android webview

我在WebView中运行了一些javascript。在这个Javascript代码中有一个返回布尔值的函数。我想检查这个函数的返回值,并依赖它隐藏我的android代码中的视图。我试了一天,但是没用。有人知道我的错误在哪里?这是我的代码:

public class MyActivity extends Activity {
    private static final String JS_INTERFACE  = "Android";
    ....

    webView.getSettings().setJavaScriptEnabled(true);
    webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
    webView.loadUrl(getUrl(this.getResources().getString(R.string.host)));
    webView.addJavascriptInterface(new WebViewJavaScriptInterface(this), JS_INTERFACE);
    webView.setWebViewClient(new WebViewClient(progressBar, this, tvError));
    webView.setWebChromeClient(new WebChromeClient(progressBar));

    webView.loadUrl("javascript:window.Android.showAdBanner(showSdkAd())");
}

public class WebViewJavaScriptInterface
{
    ....
    @JavascriptInterface
    public void showAdBanner(String jsResult) {
        if (jsResult == "true") {
            ((Activity) context).findViewById(R.id.adView).setVisibility(View.GONE);
        } else {
            ((Activity) context).findViewById(R.id.adView).setVisibility(View.GONE);
        }
   }
}

1 个答案:

答案 0 :(得分:1)

您在View.GONE if语句的两种情况下都将if (jsResult == "true")设置为window

我认为js中的webView.loadUrl("javascript:window.Android.showAdBanner(showSdkAd())");是不需要的,所以

webView.loadUrl("javascript:Android.showAdBanner(showSdkAd())");

应该是

@JavascriptInterface public void showAdBanner(String jsResult) { viewReference.post(new Runnable() { public void run() { if (jsResult == "true") { ((Activity) context).findViewById(R.id.adView).setVisibility(View.GONE); } else { ((Activity) context).findViewById(R.id.adView).setVisibility(View.GONE); } } }

此外,javascript回调将在后台线程中执行,因此在执行Ui操作之前,您需要移动到主线程(将runnable发布到视图,runOnUiThread,使用处理程序等)。

如果您有对视图的引用,则可以执行以下操作:

viewReference.post

由于您引用了该活动,因此可以将((Activity) context).runOnUiThread替换为private Handler mHandler = new Handler();

如果在主线程上初始化Handler,它将绑定到主线程。作为活动的一个领域,您可以:

viewReference.post

然后将mHandler.post替换为handleMessage(Message msg) 您还可以创建一个实现$check_key = mysql_num_rows($query_key); if($check_key < 1){ $sql = mysql_query("INSERT INTO login (user,pass) VALUES ('".$_POST["user"]."','$encrypt_password')") or die(mysql_error()); } } // brace for if($numrows==0) 的自定义处理程序,然后您可以发送一条空消息。但是,您应该阅读https://techblog.badoo.com/blog/2014/08/28/android-handler-memory-leaks/以避免内存问题。