java调用js或者js前辈帮解答一下

本帖子已过去太久远了,不再提供回复功能。在Android上实现Java和Js交互 - 80后Programer---&zhiweiofli - ITeye博客
博客分类:
其实webview加载资源的速度并不慢,但是如果资源多了,当然就很慢。图片、 css 、 js 、 html 这些资源每个大概需要 10-200ms ,一般都是 30ms 就 ok 了。不过webview是必须等到全部资源都完成加载,才会进行渲染的,所以加载的速度很重要!从Google上我们了解到,webview 加载页面的顺序是:先加载 html ,然后从里面解析出 css 、 js 文件和页面上的图片资源进行加载。如果 webkit 的缓存里面有,就不加载。加载完这些资源之后,就进行 css 的渲染和 js 的执行。 Css 的渲染一般不需要很长时间,几十毫秒就 ok 。关键是 js 的执行,如果用了 jQuery ,则执行起来需要 5-6 秒。而在这段时间,如果不在 webview 里设置背景,网页部分是白色的,很难看。这是一个很糟糕的用户体验。所以如果用网页布局程序,最好别用那些庞大的 js 框架。最好使用原生的js写业务脚本,以提升加载速度,改善用户体验。
Android 的 webview 是基于 webkit 内核的,webview 中集成了js与java互调的接口函数,通过addJavascriptInterface方法,可以将Java的类注册进webkit,给网页上的js进行调用,而且还可以通过loadUrl方法是给webkit传递一个uri,供浏览器来进行解析,实现Java和js交互。
要想运行网页上的js脚本,webview必须设置支持Javascript
mWebview.getSettings().setJavaScriptEnabled(true);
然后是设置webview要加载的网页:
web的网页:webView.loadUrl("");
本地的网页:webView.loadUrl("file:///android_asset/XX.html");
//本地的存放在:assets文件夹中
webview做完基本的初始化后我们还要要给它,加进一个回调的代理类JavaScriptInterface,并给它一个调用的名称:ncp
mWebView.addJavascriptInterface(new JavaScriptInterface(), "ncp");
JavaScriptInterface可以是一个普通的Java类,类实现的方法,均可被js回调:
final class JavaScriptInterface {
public int callOnJs() {
return 1000;
public void callOnJs2(String mode) {
Java要调用js的方法,只需知道js的方法名称即可:
mWebView.loadUrl("javascript:onSaveCallback()");
js 这边就更简单:
&script type="text/javascript"&
window.onload = function(){
document.getElementById('btn_1').addEventListener('click', onBtnClick, false);
var _int_value = window.ncp.callOnJs();
alert("get int from java:" + _int_value );
function onBtnClick() {
window.ncp.callOnJs2("click");
Java和js交互有以下一些特点:
1.Java 调用 js 里面的函数,速度并不令人满意,大概一次一两百毫秒吧,如果要做交互性很强的事情,这种速度会让人疯掉的。而反过来就不一样了, js 去调 java 的方法,速度很快,基本上 40-50 毫秒一次。所以尽量用 js 调用 java 方法,而不是 java 去调用 js 函数。
2.Java 调用 js 的函数,没有返回值,而 Js 调用 java 方法,可以有返回值。返回值可以是基本类型、字符串,也可以是对象。如果是字符串,有个很讨厌的问题,第 3 点我会讲的。如果是对象,这个对象会被转换为 js 的对象,直接可以访问里面的方法。但是我不推荐 java 返回给 js 的是对象,除非是必须。因为 js 收到 java 返回的对象,会产生一些交换对象,而如果这些对象的数量增加到了 500 或 600 以上,程序就会出问题。所以尽量返回基本数据类型或者字符串。
3.Js 调用 Java 的方法,返回值如果是字符串,你会发现这个字符串是 native 的,不能对它进行一些修改操作,比如想对它 substr ,取不到。怎么解决呢?转成 locale 的。使用 toLocaleString() 函数就可以了。不过这个函数的速度并不快,转化的字符串如果很多,将会很耗费时间。
本文由编辑发布,转载请注明出处,谢谢。
浏览 25754
zhiweiofli
浏览: 402755 次
来自: 广州
而且fragment调用back也有不需要finish的时候呢 ...
我这里就是拦截的,但是还是报了这个
&div class=&quote_title ...
上线毛啊,Bad request了
不错 !!!!!!!!!!!!!!谈谈java与js中的&&、& ||、|
我的图书馆
谈谈java与js中的&&、& ||、|
java中的逻辑运算符主要逻辑非!、逻辑与&、逻辑或|、短路与&&、短路或||及逻辑异或^
javascript中逻辑运算符同样会有java中这些运算符,不过还是有些不同的。js中的逻辑与是java中短路与“&&”逻辑或是java中短路或“||”而java中逻辑与或在js中是按位运算的来计算的,而在java中则是根据表达式值的类型来判断是否为位运算。
下面来针对举例说明这些问题
首先,java逻辑与“&”与js“&”比较
这里在标题中已经说名了是逻辑与“&”运算,所以在写我们逻辑与运算两端的表达式时需要注意了。不要违反规则了,
规则:逻辑与“&”两端的表达式结果必须是逻辑值类型的也就是必须true或false。明白上面的规则之后,我们来看下面这例子:
Java代码 &System.out.println(1&2);//错误的写法,编译通过&输出结果?&&System.out.println(1|2);//错误的写法,编译通过&输出结果?&&&&System.out.println(3&5&2&3);//false&&System.out.println(1&0|2&0);//true&&
Js代码 &document.write((1&2)+"&Br&");&//&当然写法错误,但没有报错,并且同样有结果&&document.write((1|2)+"&Br&");&//同上&&&&&&document.write((1&2&2&1)+"&Br&");&//0&&先计算关系表达式并进行位运算&&document.write((1&0|2&1)+"&Br&");&//1&&关系运算----&位运算&&&&&&document.write((1&2&2)+"&Br&");&//0&&关系运算----&位运算&&document.write((1&0|1)+"&Br&");&//1&关系运算----&位运算&&
在上面的例子中,在java中System.out.println(1&0|2);//写法不正确,编译通不过,所以这中情况不成立,在上面的举例中漏掉了这里补充上,“&”运算符通过上面代码及结果分析,我们大体对java与js使用逻辑与运算符的区别了吧,那么我们现在能知道在上面的java举例中那两个编译通过,但是写法符合逻辑运算的规则的结果了吗?答案:按位运算的结果
因此,这里我们可以总结一下:在java中使用逻辑与“&”运算,如果运算符表达式两端符合逻辑运算规则,则就是按逻辑运算判断结果,true或false,而两端若是为数值类型的则是位运算,这时我们需通过进行二进制位运算来判断结果,一端为关系表达式一端为数值类型的数字不合法,编译出错。js中使用逻辑与“&”时 与java不同,它是把“&”一直作为位运算符来操作,并没有逻辑与的意思。而在js中它把逻辑值true当做1,false当做0,然后再进行位运算得出运算结果。
其次java中的逻辑或“|”与js中“|”基本和上面的一样,这里就不多描述了。
下面来看看java中短路与“&&”短路或“||”与js中所谓的逻辑与“&&”逻辑或“||”有什么不一样的地方
通过实例来总结:
java实例:
Java代码 &&&&&&&&&&&&&&&&&&&System.out.println(1&0&&2&0);//false&&&&&&&&&&System.out.println(1&0||2&0);//true&&//&&&&&&System.out.println(1&0||2);//错误,编译不通过&&//&&&&&&System.out.println(1&0&&2);//错误,编译不通过&&//&&&&&&System.out.println(1&&2);//错误,编译不通过&&//&&&&&&System.out.println(1||2);//错误,编译不通过&&
Java代码 &document.write((1&2&&2&1)+"&Br&");//false&&document.write((1&2||2&1)+"&Br&");//true&&document.write((1&2&&2)+"&Br&");//false&&document.write((1&2||2)+"&Br&");//true&&document.write((1&2&&5)+"&Br&");//5&&document.write((1&2||2)+"&Br&");//2&&document.write((1&&5&3)+"&Br&");//true&&&document.write((8||1&2)+"&Br&");//8&短路运算,表达式一为true则不继续,结果返回表达式一的值&&document.write((1&2||false)+"&Br&");//true&&document.write((true&&5&3)+"&Br&");//false&只要有逻辑类型的值参与其中结果一定返回为逻辑true或false&&
通过上面实例代码及结果分析,短路与“&&”短路或“||”在java中还是比较好掌握的,只要遵循其原则。而在js中则显得有些灵活不定,它将js中关系运算结果true为1,false为0,所以它跟其表达式两端类型的不同而得到不同逻辑类型或者数值类型的结果。所以在js中使用逻辑运算还是需要仔细认真去写的,因为js相对比较灵活,限制规则不是很严格,不注意写错了。或表达式不争确很容易造成结果的改变。
好了,以上就是我对逻辑与、或及短路与、或 位运算在java与js中总结。有什么地方不正确的,还希望大家多多指出,共同进步!
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢技术分享(234)
&转载请注明出处
& & & & 挺帅的移动开发专栏 &
& & & &在android的开发过程中,有很多时候需要用到本地java代码和javascript进行交互。android对交互进行了很好的封装,在开发中我们可以很简单的用java代码调用webview中的js,也可以用webview中的js来调用本地的java代码,这样我们可以实现很多原来做不了的功能,比如点击网页上的电话号码后,手机自动拨打电话,点击网页中的笑话,自动发送短信等.
废话不多说,这次教程的目标如下
android 中的java代码调用webview里面的js脚本webview中的js脚本调用本地的java代码java调用js并传递参数js调用java并传递参数
android中调用webview中的js脚本非常方便,只需要调用webview的loadUrl方法即可(注意开启js支持)
webview中js调用本地java方法,这个功能实现起来稍微有点麻烦,不过也不怎么复杂,首先要对webview绑定javascriptInterface,js脚本通过这个接口来调用java代码。
javainterface实际就是一个普通的java类,里面是我们本地实现的java代码, 将object 传递给webview,并指定别名,这样js脚本就可以通过我们给的这个别名来调用我们的方法,在上面的代码中,this是实例化的对象,wst是这个对象在js中的别名
java代码调用js并传递参数
只需要在待用js函数的时候加入参数即可,下面是传递一个参数的情况,需要多个参数的时候自己拼接及行了,注意str类型在传递的时候参数要用单引号括起来
js调用java函数并传参,java函数正常书写,在js脚本中调用的时候稍加注意
然后在html页面中,利用如下代码,即可实现调用
这里准备了一个实例,实现上面的功能
这里是实例的html代码,从assert中加载,原来做项目的时候,从assert中加载的中文网页会出现乱码,解决办法就是给html指定编码。如下
java代码 如下
希望对大家有所帮助
资源下载地址
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:190385次
积分:3573
积分:3573
排名:第7997名
原创:149篇
转载:123篇
评论:12条
Github: <//houzirui
Mail: hzrhzr@
(5)(3)(3)(10)(3)(14)(10)(10)(19)(17)(5)(16)(42)(80)(24)(1)(4)(10)

我要回帖

更多关于 nodejs和java混合开发 的文章

 

随机推荐