您的位置:首页 > 移动开发 > Android开发

在android的webview中 javascript与java代码互相调用

2013-07-18 22:46 711 查看
为什么

一个项目,后台数据的接口是json的,这个json对象结构还比较复杂,而且我只是用这个json对象拼出几个字符串。恰巧,那边给了根据这个json拼写字符串的javascript代码片段(挺长的一个拼写代码,各种判断)。如果用反射解析,要创建很多的类,还要费劲把js代码改成java的,all stupid work。这个对象又没有其他的作用,反射解析显得非常不值得。

不如顺坡下驴,数据是json,又有js代码,不如就用这段js把这个数据生成就好了。

这就需要从java调用javascript代码,并且把javascript代码中的数据传回到java中。

我们有什么

有json对象这个变量,一段js代码(可以操作这个json变量,得到一些字符串)。我们要利用这两个东西工

作。执行js代码当然要用浏览器,webview是android中可以做这个的现成工具。

做法

先要得到可以执行的html代码,我们可以从其他的流中读取,可以在本地也可以在网上。然后把这个文件与获取到的json拼起来

拼的方法:

var data = ${data};
function getText()
{
data.****
.....
window.stub.jsMethod(result);//调用java传过来的接口,并把result传递过去。
}


然后再用json的代码,替换${data},具体怎么替换就不说了,string的操作。然后下边的js代码就可以使用data这个变量了,替换后的结果应该是

var data={
a:""
b:""
c:{...}
.....
}
function ....


然后我们把这段代码导入到webview中

webview:

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JsToJava(), "stub");
mWebView.loadDataWithBaseURL("", htmlCode, "text/html", "UTF-8", "");
//          等上边的webview加载html代码完后,就可以调用js那边的接口:
mWebView.loadUrl("javascript:getText()");
其中htmlCode中就包含就是我们拼接好的要执行的js代码。

js调用java方法时,只能传递基本数据类型,目前我试过的数组都穿不回来,所以要传回来的东西最好拆开

private class JsToJava
{
@JavascriptInterface//API17后要加这个比较好
public void jsMethod(String str1, String str2, String str3)
{
final String value = str1 + "\n" + str2 + "\n" + str3;
getActivity().runOnUiThread(new Runnable()
{
@Override
public void run()
{
updateData(value);
}
});

}

private void updateData(String value)
{
//更新UI的代码
}
}


还有就是js调用java方法时,默认应该是在另一个线程中执行的。不在UI线程中更新UI,会有一些bug。这里可以选择Handler等方法更新UI,这里直接用了简单的runOnUiThread方法。

先写这么多

参考资料一会补上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: