我在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);
}
}
}
答案 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/以避免内存问题。