Android Dalvik虚拟机初识 分享

首先,让我们来思考下面几个问题:

什么是Dalvik虚拟机?

Dalvik VM与JVM有什么区别?

Dalvik VM有什么新的特点?

Dalvik VM的架构是怎么样的?

首先,我得承认第一个问题问得很傻:什么是Dalvik虚拟机?没有人给出过一个明确的定义,但是,我们似乎可以从人们对Java虚拟机的描述中得到些信息。

Java 虚拟机(JVM)是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。它有自己完善的硬件架构(如处理器、堆栈、寄存器 等),还具有相应的指令系统。使用“Java虚拟机”程序就是为了支持与操作系统无关、在任何系统中都可以运行的程序。 阅读全文 >>

Android 开发者官网镜像站点收集

怎么都搞不明白,一个纯技术性的网站 Android 开发者 http://developer.android.com/ 会被墙,找不到合适的理由。仅仅是出自于 Google,因 Google 不听 ZF 的话受影响?Android 牵动了什么人的神经,影响了什么群体的利益?

作技术的不能因为正常方式访问不了就不去另想他途,翻墙方式的种种这里不累述了。我们不会像多数人一样,以为搜索引擎只有一个百度(多数人其实根本不知道那个叫做搜索引擎)。在常规方式下,幸好还有不少 Android 开发者网站的镜像可以访问,虽然有些并不能非常及时的跟进同步,但也足够用的。

这里就收集一些可访问的 Android 镜像站点,千万不能因为我把它们集中在一块而给某些别有用心的人得了方便,而后害了那些热心的网站,那我可真的是很无聊。随着 appspot.com 的不幸,也让 http://androidappdocs.appspot.com 失效了。如果还有别的镜像站点,希望大家多多提供,谢谢啦。 阅读全文 >>

解决 Eclipse 中 Android.jar 无法关联源代码的办法

在 Eclipse 中一般的 jar 包在(F3 或 Ctrl + Click) 进到它的 Class 时,如果没有关联上源代码会有一个按钮让你关联下就可以查看源代码。可是在 Eclipse 中的 android.jar 中的类,却只会提示

Source not found
The JAR of this class file belongs to container 'Android 1.6' which does not allow modifications to source attachments on its entries.

也就是正常渠道关联不上源代码,那使用手动来引入 android.jar,用传统的方式来关联源代码如何,源码是能看到了,可是出现个错误。还是 Google 下吧,找到了 Browsing Android Source in Eclipse,他给我们提供了两种解决办法:

#Solution 1 阅读全文 >>

Tomcat 7 启动时出现 java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory

在 Eclipse WTP 3.1.1 中换成了使用 Tomcat 7,当然选择的仍然是 Tomcat 6,只是指向的目录是 Tomcat 7 的,一启动便立马出现错误:

java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
at org.apache.catalina.startup.Bootstrap.<clinit>(Bootstrap.java:60)
Caused by: java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 1 more
Exception in thread "main" 阅读全文 >>

Lucene 索引、查询日期类型字段

Lucene 的 Field 在构造时内容参数可接受一个字符串或者字节数组,流等,不支持 Date 等类型。如果把 Date.toString() 转换成字符串来索引的话那么存储在索引中的样子就不确定(new Date().toString() 为 “Tue Mar 15 13:25:41 GMT+08:00 2011”),也给下次还原来为 Date 类型带来不便。在以前的版本 Lucene 专门提供了 DateField 来索引 Date 类型,但

现在不推荐使用了,而且也无法用,因为 Lucene 的 Document 在 add(Fieldable field) 时接受的是一个 Fieldable 类,然而 DateField 并未实现 Fieldable 接口,保留它是用来读取老的索引文件。

那 Lucene 要怎么索引日期类型呢?说到底,还是把它转换为字符串,搜索的时候从存储的字符串还原出来,辅助工具类是 DateTools, 它所提供的方法: 阅读全文 >>

JDK 7 中的语法增强 -- (4) 创建泛型实例时的类型推断

Java 的泛型实例在声明时有点傻,比如像这样的语句 List<String> list = new ArrayList<String>(); 前明的 List<String> 已经提供了足够的信息让编译器知道 ArrayList 的参数类型,当然这是个简单的例子,如果复杂些,来点嵌套的话:

Map<String, List<Map<String, String>>> myMap = new HashMap<String, List<Map<String,String>>>();

那就够呛的,所以 Java 的这一语法要求也让 Scala 这样的语言所诟病,当然人家 Scala 是个趋近于动态性的语言,它认为上面的语句应该这么写:

val x = new HashMap[String, List[String, List[Map[String, String]]]() 或者是
val x: Map[String, List[String, List[Map[String, String]]] = new HashMap()

总之,只要一端的表态就行,其他事情交给编译器来推断。现在 JDK 也反省到了这一点,因为引入一个叫做菱形操作符(Diamond operator) 的东西,即两个尖括号 <>。让使得你像 Scala 一样只要在左边声明参数类型就行啦。这个操作符不免让我想起了在 perl 里有个 <=>  这样的操作符,好像叫做飞机,不是斗地主的飞机,它相当于 Java 里的 compareTo() 的功能。

于是泛型实例的声明就简单化成了 Map<String, List<Map<String, String>>> myMap = new HashMap<>(); 继续往下看: 阅读全文 >>

JDK 7 中的语法增强 -- (3) swith 里用 String 类型

java 在 switch 语句这一项上更多的是承袭了 c++,其实整个语法就是 c 风格的。java 的 switch 里只能用 byte、char、short、int 和 enum 类型,连 long 型都不能用(因为 switch 里的要被转换为 int  型,而 long 太长了)。要说不支持 float 和 double 那样的浮点那好理解,因为它们本身是不精确的,1 可能是 0.9999999999。boolean 就两值,放 switch 里无意义,因为 c++ 的 switch 里可用bool 型,但在 java 中遭摈弃。

现在在 jdk7 里 switch 可以用字符串了,学了 c#,字符串的好处就是它是表意的,像 switch(action) case "create" : ...; case "delete" : .....,多写意啊,再也不用先定义一堆常量,然后再 switch(action) case Constants.ACTION_CREATE : ......; case Constants.ACTION_DELETE : ......,当然写过不少程序的尽量会避免写成 case 1... case 2 这样的写法了,会让人不知所以的。常量放在 case 中就要求我们经常要去查它定义的值是什么。 阅读全文 >>

OpenVPN Windows 平台安装手记

VPN 用途还是很广泛的,比如家里连接公司的网络解决紧急问题,安全因素考虑时两个分部间的互访。而且在兲朝 VPN 可能还承载着更大的功用,比如你在外面有个主机或是 VPS 就可以试下。OpenVPN 是免费的(Community 版免费),它可以让你异地两个电脑组成一个局域网,可以是 client-to-client, 现 proxy 一下;或是 push 成 gateway,透明的进行 proxy -- 当然还需要更多的设置,像 NAT、Route 等。

OpenVPN 是跨平台的,这里讲下 Windows 平台的 OpenVPN 如何安装设置。下载页面:http://openvpn.net/index.php/open-source/downloads.html,当前 Windows 平台下的版本是 openvpn-2.1.4-install.exe阅读全文 >>

HttpClient 模拟登陆,保持会话并进行后续操作

Apache HttpClient 是很方便的 Java 开源的访问 HTTP 资源的组件。网站上的资源不总是能匿名访问的,很多都需要登陆后才能操作,且不说论坛里登陆后才能发言,就是某些稍显敏感的 XML 等信息也是登陆后才能获取到的。

没问题,HttpClient 能让你做到,它提供了 Basic 和 Form-Based 两种验证方式。登陆后获得服务器端发来的 Cookie 作为下一次访问的凭证, 让服务端认为你还是个合法用户。服务端不是用 Session 来维护会话的吗?是的,Session 也要有个载体,Cookie 了。或有时 Java Web 会用 jsessionid 参数在服务端与客户端来回关联 Session 信息,也没问题,HttpClient 同样能胜任。

下面主要说明 Form-Based 的验证方式,Basic 的验证简单列了几行代码,还未实践,具体可参考文后的链接。 阅读全文 >>

JDK 7 中的语法增强 -- (2) 数值常量中的下划线

再次进入到 JDK7 语法增强的第二道道上来,也就是数值常量书写时可以中间插入下划线作为分隔线,也就是 int i = 22_33 相当于 int i = 2233,仅仅是一定程度上的有助于阅读代码,除此之外,别无它处。编译后或执行时这些下划线便透明掉了,编译后的字节码里也没有了附加的下划线,当然执行时也不可能向你输出下整数 i 为 22_33 的。

也不知道是谁只是众目期盼中的版本净找些这类来增强,感觉意义不是很大,大约类同于二进制方式来表示整数。这里的数值包括整数和小数的,加上 16 进制那么可用来表示数字的字符就有 0-9 和 a-f(A-F) 了,注意下划线只能加在前面所列的某两个字符之间,而且可连续多个下划线。看例子吧: 阅读全文 >>