WebView突然无法调用JAVA,Webview 中 Javascript 无法调用 Java 对象

【问题产生】

Webview 通过 addjavascriptInterface 传递对象给前端,一切正常。但是 Android官方已提醒此功能是有安全风险,改用 safe-java-js-webview-bridge 做java和js交互。

官方的用法正常:

HostApp.alert

HostApp.toast

但如果我们在body里的

HostApp.alert(‘alert‘); //直接调用,无法找到HostApp

window.οnlοad= function(){

HostApp.toast(‘document ready now‘); //onload后调用,依然无法找到HostApp

};

$(document).ready(function(){

HostApp.toast(‘document ready now‘); //ready后调用,依然无法找到HostApp

});

【原因】

Safe Java-JS WebView Bridge 注入HostApp-JS片段的时机,可能在onload前也可能在其后。

如果document.ready的时候HostApp JS已经注入成功,在onload的时候调用没有问题。当onload的时候HostApp JS还未开始注入,就无法找到HostApp了。

【解决】

官方提供方法:

在js脚本层就需要做出变动,即轮询状态,直到端注入成功或者超时(1.5s),再发生回调。具体实现如下(下面的是以 zepto.js的$.ready()函数改造为例)。

//针对DOM的一些操作//Define methods that will be available on all//Zepto collections

$.fn ={//DOM Ready

ready: function(callback, jumpHostAppInject) {var originCb =callback;var mcounter = 0;//尝试等待(1500ms超时)让端注入HostApp Js

callback = function() {if(!window.HostApp && mcounter++ < 150)setTimeout(callback, 10);elseoriginCb($);

};//是否跳过等待HostApp的注入

if(jumpHostAppInject) {

callback=originCb;

}if (readyRE.test(document.readyState)) callback($); else document.addEventListener(‘DOMContentLoaded‘, function() {

callback($)

},false);return this},

...

...

};

这样的机制也就解释了为什么不把Java层的JS注入放在OnPageFinish了,如果那样页面轮询的次数就会上升,等待的时间就会变长,而且有可能会超时。好了,有了上面的改动,页面初始加载完备时需要立即触发HostApp的调用,如下:

$(function() {

HostApp.alert("HostApp ready now");

});

如果懒得去修改,可以到 gitHub 下载此插件提供的 zepto.js

由于本人项目没有用zepto,在初始化init的时候,按官方推荐的方法做了一个轮询。

var step = 0; //重试次数

window.οnlοad= function() {functionisReady() {if(step < 150 && !window.HostApp) { //重试150次

step ++;

setTimeout(isReady,10);

}else{

init();

}

}

isReady();

};

原文:http://www.cnblogs.com/dcchan/p/5630383.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的示例代码,演示如何在 Android 的 WebView 使用 JavaScript 调用 Java 方法: 1. 首先,在 Java 定义一个类,包含一个供 JavaScript 调用的方法: ```java public class JavaScriptInterface { private Context context; public JavaScriptInterface(Context context) { this.context = context; } @JavascriptInterface public void showToast(String message) { Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } } ``` 在这个类,我们定义了一个名为 `showToast` 的方法,用于在 Android 应用显示一条 Toast 消息。 2. 接下来,在 Activity 创建一个 WebView 实例,并将 JavaScript 接口对象传递给它: ```java WebView webView = findViewById(R.id.webview); webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new JavaScriptInterface(this), "Android"); ``` 在这个代码,我们首先启用 WebViewJavaScript 功能,然后创建了一个 `JavaScriptInterface` 对象,并将其注册到 WebView 。我们还将这个接口对象命名为 `Android`,以后在 JavaScript 使用这个名称来调用它。 3. 最后,在 HTML 编写 JavaScript 代码,调用 Android 接口的方法: ```html <button onclick="showToast('Hello, Android!')">Show Toast</button> <script> function showToast(message) { Android.showToast(message); } </script> ``` 在这个代码,我们定义了一个按钮,当用户点击它时,将调用 `showToast` 方法。在 JavaScript ,我们使用 `Android.showToast` 来调用 Android 接口的方法。 这就是一个简单的示例,演示了如何在 Android 的 WebView 使用 JavaScript 调用 Java 方法。需要注意的是,这个方法需要在 Android 4.2 及以上版本才能使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值