让Java跟Javascript更加亲密

在移动App开发中,为了快速迭代,通常都会使用Native+Web的模式开发。具体来说就是使用Java提供接口,使用WebView控件嵌套Web页面来实现UI和交互。

在Android中,Java可以很方便的提供接口给WebView中的Js进行调用,只要以下一行代码就能搞定:

mWebView.addJavascriptInterface(new JavascriptInterface(), "custom_name");

这样,JavascriptInterface的所有声明为public的方法,都能被mWebView中的Js通过以下方式调用:

window.custom_name.xxx();//xxx为JavascriptInterface的公有方法

而Java需要调用Js时,则是通过WebView实例的loadUrl方法调用:

mWebView.loadUrl("javascript:xxx(yyy)");

这其实跟你在浏览器的地址栏敲下“javascript:alert(1)”的原理是一样的。

一切看起来都是那么的美好,只是……

当Java需要传递大量字符串给Js时,URL就力不从心了。另外,从URL执行的Js,在页面没加载完成时,是有可能导致页面出现undefined错误(因为要执行的那个方法可能还没有声明呢),会引发各种奇形怪状的错误。

继续阅读…

从网页监听Android设备的返回键

最近搞Android项目的时候,遇到一个比较蛋疼的需求,需要从Client App调用系统浏览器打开一个页面,进行杂七杂八的一些交互之后,返回到App。如何打开浏览器和如何返回App这里就不说了,有兴趣的童鞋可私下交流。

之所以说这个需求蛋疼,是因为Android有个物理返回键啊……返回键啊……键啊……啊……

用户按下返回键后,预期应该跟点击页面上的返回键一样——返回App。然而这个返回键的被按下的时候网页完全不知道啊(onbeforeunload不算),找不到直接的办法去监听,愁死我们这全苦逼程序员鸟~

虽然啊不能直接监听,曲线救国的办法,还是有滴。 继续阅读…

Commons-Fileupload组件的一些坑

Java Web中经常需要用到文件上传,比较有名的组件就是Commons-Fileupload、COS、SmartUpload(几年前的记忆了,不知道还是不是……)。

前段时间做个Android需求,需要从客户端POST图片到Server(用了Commons-Fileupload),结果它死活解析不出文件来。

组装成的表单内容如下:

--abcdefghijklmn
Content-Disposition: form-data; filename="name"
Content-Type: content/unknown

abc.jpg
--abcdefghijklmn
Content-Disposition: form-data; filename="yyy.jpg"
Content-Type: content/unknown

some data
--abcdefghijklmn

很正常的一个表单,POST到另外个Sever(用了别的文件上传组件),却能正常解析。因此问题一定是出现在Fileupload的表单解析上。于是跟做CGI的童鞋一起研究了下,把直接用Web页面POST的表单内容拿过来比较,总算发现问题了。看下面高亮的地方: 继续阅读…

localStorage也跨域

最近做一个项目,改动到了两个页面(A,B):在A页面(aa.example.com/a.html)往localStorage写一个key,然后在稍候的B页面(bb.example.com/b.html)读出来。结果是写的时候成功了,在A页面也读出来了,跑到B页面,localStorage却是空的!

20130117160735

别急,待俺掐指一算……嗯,子域不同,localStorage应该也是不一样的。在A页面的逻辑完成的时候,跳转到bb.example.com/a.html 进行设置key的话,写key和读取key都是同一个域了。

20130117161036

 

结果……啊,我要崩溃,还是读不出来!但是t它(A,B)的上一个版本是可以的,为虾米呢?

继续阅读…

Compiler@NodeJS(二)- 强大的管道

接上篇:Compiler@NodeJS(一) – Web项目编译脚本

直接切入主题吧。

PS:打个广告先,Compiler@NodeJS,Web开发、居家旅行、杀人越货之必备良药!

比较深入的用过linux的童鞋,一定记得这个“|”。它的使用方式是这样子的:cmd_a | cmd_b,意思是执行cmd_a 并且把cmd_a输出的结果,作为cmd_b的输入参数,传给cmd_b并执行它。例如我在shell中执行 top | grep node,就可以把进程名字包含node的进程的相关信息都找出来。如下:

2012-12-19_190836

PS:top是实时显示进程状态的命令;grep是文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

如上,管道可以把多个命令串联起来,只要这些命令都有输入输出,就能无限串联(理论上的……) !哇哈哈哈~~

嗯,回到compiler这里,看看是怎么来使用管道的。 继续阅读…

Compiler@NodeJS(一) – Web项目编译脚本

转眼这一年又要到尾声了。想想这一年,貌似没干啥大事,却写了一堆杂七杂八的脚本,零零碎碎的。单个单个地用的时候是挺爽的,一旦跟已有项目结合起来的时候,由于之前的编译脚本是用python写的,没有灵活的插件机制,操作起来相当的不方便。就比如之前写的自动合图脚本(iSpriter),如果要在项目中加入,就得手动执行一次合图脚本,然后再执行python编译脚本。万一忘了合图,就会酿成发布事故。

因此,一直都在计划着用NodeJS实现一个编译脚本,可以方便的把以前写的一些脚本组合起来。于是抽了一些时间,整了这个编译脚本(compiler)。 继续阅读…

Canvas中createRadialGradient的各种取值研究

话说上次melody同学分享了canvas绘图的相关内容,大家都对createRadialGradient的输入参数和结果蛮感兴趣的。因此我也把它的各种取值都试了一遍,发现了一些有趣的东西,共享之。

首先说下createRadialGradient,createRadialGradient是canvas创建发射渐变的一个方法,它的形参是这样子的:

createLinearGradient(xStart, yStart, radiusStart, xEnd, yEnd, radiusEnd)

前三个参数是起始圆(cycle1)的x、y、半径,后三个是终点圆(cycle2)的x、y、半径。其它介绍就不多说了,可以看看w3school的介绍

参数 描述
xStart, yStart 开始圆的圆心的坐标。
radiusStart 开始圆的半径。
xEnd, yEnd 结束圆的圆心的坐标。
radiusEnd 结束圆的半径。

于是我们在想,cycle1 > cycle2会怎么样了?cycle1==cycle2有会有什么结果呢? 继续阅读…

1 2 3 8  返回顶部