`

手机Java之怪现象

    博客分类:
  • J2ME
阅读更多

下面记载的都是手机java实现中各种奇怪的毛病,bug,或者……特性,是根据某项目的开发经验总结出来的。但是涵盖的手机型号还是有限。因此很有可能某些“特性”会存在于更多的采用了相同JVM(比如平台相同、生产厂商)的手机上。

 

JAVA手机网[www.cnjm.net]

== 早期S60的内存泄漏 ==

这个bug可以上溯至2003年,甚至更早。表现为java应用中如果使用了Class.getResourceAsStream("本地文件")无法释放其占用的内存,是的,没有任何办法,无论是调用获得的的InputStream实例的close()或将其设为null,甚至显式强制 System.gc(),都没有效果。结果就是至少和本地文件同尺寸的内存成为了无法回收的垃圾。这个问题还影响到以 Class.getResourceAsStream()为基础的Image.createImage()(这个是最要命的,如何能够不使用图片资源呢!)。

这个bug据说在新的S60上已经解决了。但是Nokia3230(4.0526.2ch)、Nokia7610(6.0525.0ch)都存在这个问题。对于这些个有问题的机型,在java程序中是无法完美解决这个问题的,只能尽量避免。比如集中、统一载入资源,永不释放(也就是说,尽量控制泄漏的次数)。当然,这会对已有代码造成很大影响。毕竟手机java应用是内存受限系统的典型,大多数情况下,珍贵的内存中只保留需要的资源。

== 键盘响应事件 ==

在MIDP1中,获取键盘事件只能自己实现Canvas.keyPressed()。但是MotorolaE398和SonyEricssonK700c 的实现却很奇怪。表现为左右软键有可能在这个方法中捕获不到。而是否能够成功捕获,取决于keyPressed()方法中代码的行数……

我承认我没彻底搞清楚这其中的玄机。鬼知道Motorola和SonyEricsson是怎么实现的JVM。我只知道把keyPressed中的所有代码提取到另外一个函数中,在keyPressed只把参数传递给新函数,问题就消失了……

== 超慢的drawRegion ==

除了N-Gage QD,几乎所有的NokiaS60手机都实现了MIDP2的支持。MIDP2中,最为重要的几个特性之一就是Graphics.drawRegion。这个API可以方便的将图片旋转、剪切之后画到画布上。

但是,这个API在Nokia3230、Nokia7610等手机上的实际性能表现让人实在不敢恭维。于是,这个最重要的API成了摆设……没什么怎么办,只能急需延用MIDP1的做法,自己实现剪切和旋转,或者像我一样懒,直接要求美工把旋转之后的图片全都做出来……

JAVA手机网[www.cnjm.net]

 

== 诡异的内存容量 ==

按照官方Spec,Java在Nokia3125上的可用内存(即Java Heap Size)为512k。但是实际测试的结果是,Nokia3125只有412k左右的实际内存,相差整整100k。不过好在Nokia3125并不是种市场保有量很高的型号。但是它是我正在使用的型号……

== 无法repaint ==

这个问题只存在于SonyEricssonK700c。表现为在keyPressed()中调用repaint()进行屏幕重画没有任何反映。

JAVA手机网[www.cnjm.net]


解决办法是,在keyReleased()中补一个repaint()……

== UTF8 ==

还是SonyEricssonK700c的问题。问题存在于new String(byte[], charset)上。也就是说,当获得了某个byte[],并希望用UTF8作为字符集将其转换为字符串的时候,使用上述方法在 SonyEricssonK700c上会出现丢失字符的现象。这个现象很诡异,以至于我目前没有搞清楚什么情况下会丢失字符(我甚至专门写了个测试程序在真机上跑,得出的结论是丢失字符的原因可能会很复杂,简单的拿被丢掉字符附近的一个子串来测没有任何问题)。

幸亏还是有解决办法的。不用new String就完了,而要用更加麻烦的办法,比如像我一样,用ByteArrayInputStream,外面套 InputStreamReader(bais, "UTF8"),然后用StringBuffer一个一个char读进来,最后再toString()……

== 不可靠的copyArea ==

这是Motorola机器上的问题,V3和E398都有。copyArea是Graphics的作整块屏幕像素copy的常用API(2D动态背景的游戏几乎是必不可少)。按照Sun官方的Spec,手机厂商有义务来保证其API实现不存在覆盖冲突问题。但是Motorola显然做得不够好。在 Motorola手机上使用这个API会随机产生贴图混乱的情况……

解决办法是自己实现另外一套机制。比如使用另外一张至少和屏幕同样大小的Image作为缓冲,用两次drawImage来替代copyArea……不过这个方法显而易见的缺点是消耗了更多的内存(那可是不小于屏幕尺寸的Image啊!)。如果内存实在吃紧,只能退而再求其次,作为缓冲的Image继续缩水,drawImage的次数继续增加……不过这个时候需要自己手工解决覆盖冲突……

JAVA手机网[www.cnjm.net]

 

== 无法安静下来的3220 ==

不知道这个问题是不是在S40平台上都有,手里S40又支持MIDI的手机实在是太少了……

3220的一个很明显的特征就是声音大。以至调用了VolumeControl.setLevel(0)之后还是有声音,和Sun官方的Spec完全不符……没办法,只能在需要静音的时候,再补一个VolumeControl.setMute(true)。

== 永不ready ==

这是一段手机java获取网络数据的常用代码:while(InputStream.ready()) { InputStream.read() }。

JAVA手机网[www.cnjm.net]

但是经测试,在Nokia3230上,这个ready永远返回false……没办法,如果不改上述代码的话,就自己实现一个继承类吧。

 

 

转自:http://www.j2megame.org/index.php/content/view/1856/125.html

 

 

 

分享到:
评论

相关推荐

    WM6 手机java模拟器

    【WM6手机Java模拟器详解】 在移动设备领域,Windows Mobile 6(简称WM6)是一个基于微软Windows CE内核的操作系统,广泛应用于早期的智能手机。对于那些希望在WM6设备上运行Java应用程序的用户,Java模拟器成为了...

    48款JAVA手机游戏打包下载 [JAR经

    Java手机游戏是基于Java技术开发的移动设备游戏,主要适用于早期的智能手机和平板电脑,尤其在功能手机时代非常流行。这些游戏通常以JAR(Java Archive)格式进行打包,便于在支持Java ME(Mobile Edition)平台的...

    Java手机游戏--帝国时代.jar

    Java手机游戏--帝国时代.jar Java手机游戏--帝国时代.jar Java手机游戏--帝国时代.jar Java手机游戏--帝国时代.jar

    手机JAVA程序修改器

    为了解决这一问题,出现了一款名为“手机JAVA程序修改器”的小工具,它旨在帮助用户和开发者调整和优化Java程序,以便更好地适应不同手机的需求。 “手机JAVA程序修改器”针对的是Java应用程序的内部参数,包括键值...

    手机PDF阅读器java版

    本文将深入探讨Java版手机PDF阅读器的设计、实现原理以及使用方法。 一、PDF阅读器概述 PDF阅读器主要负责解析PDF文件结构,将其转换成可显示的图像,并提供浏览、搜索、注释等互动功能。在Java平台上开发PDF阅读器...

    85个支持触屏的手机java游戏

    Java游戏在早期智能手机时代占据着重要的地位,尤其是对于支持触屏功能的手机而言。这些游戏不仅丰富了用户的娱乐生活,还展示了移动设备的互动性。本文将深入探讨Java游戏在触屏手机上的应用及其特点。 Java游戏是...

    JAVA手机游戏编程

    Java手机游戏编程是一个涵盖多个领域的复杂主题,主要集中在Java Micro Edition (J2ME)平台上,这个平台被广泛用于开发移动设备上的应用程序,尤其是早期的智能手机游戏。《J2ME&Gaming》这本书深入浅出地介绍了如何...

    最新45款Java手机游戏开发源代码

    最新45款Java手机游戏开发源代码 最新45款Java手机游戏开发源代码 最新45款Java手机游戏开发源代码 最新45款Java手机游戏开发源代码 最新45款Java手机游戏开发源代码 最新45款Java手机游戏开发源代码 最新45款Java...

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    JAVA_API1.6文档(中文)

    java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类...

    java手机游戏--斗地主.jar

    java手机游戏--斗地主.jar java手机游戏--斗地主.jar java手机游戏--斗地主.jar java手机游戏--斗地主.jar

    中国移动LBS手机定位JAVA源码

    中国移动LBS手机定位JAVA源码,CELL-ID技术是目前最简单的定位技术,它的原理是通过获取目标手机所在的蜂窝小区ID来确定其所在的位置,提供给定位用户。它不需要移动台提供任何定位测量信息,也无须对现网进行改动,...

    java版摩天大楼(诺基亚手机里的)

    Java版的摩天大楼是一款经典的基于Java平台的游戏,它在早期诺基亚手机上非常流行。这款游戏以构建和管理虚拟城市中的摩天大楼为主要玩法,让玩家体验建设都市的乐趣。在给定的信息中,我们有两个不同的版本:yb和...

    三星JAVA传输免刷机软件

    其中,JAVA传输技术对于许多用户来说是一个非常实用的功能,它允许用户在不进行刷机操作的情况下,方便地管理和共享手机中的JAVA应用程序。"三星JAVA传输免刷机软件"就是这样一个工具,旨在简化用户对JAVA应用的处理...

    数十个手机JAVA 320X480触摸大屏游戏

    数十个手机JAVA 320X480触摸大屏游戏 网上非常之难找的哦 多数为破解版,理论上支持所有的JAVA功能手机,放心的下,好好的玩吧 !

    Java 面经手册·小傅哥.pdf

    这是一本以面试题为入口讲解 Java 核心内容的技术书籍,书中内容极力的向你证实代码是对数学逻辑的具体实现。当你仔细阅读书籍时,会发现Java中有大量的数学知识,包括:扰动函数、负载因子、拉链寻址、开放寻址、...

    java源码包3

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    手机Java游戏破解软件halo.以及教程一体化

    破解手机JAVA游戏收费,可以随意玩游戏!

    java源码包2

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    JAVA API官方中文版手册chm文件文档

    JAVA API官方文档中文版软件包 java.applet java.awt java.awt.color java.awt.datatransfer java.awt.dnd java.awt.event java.awt.font java.awt.geom java.awt.im java.awt.im.spi java.awt.image ...

Global site tag (gtag.js) - Google Analytics