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

为什么

一个项目,后台数据的接口是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方法。


先写这么多

参考资料一会补上


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值