J2me总结二

关键词:娶过来,摆出来,听她的

显然,基本上所有的智能程序所拥有的三大基本特征是:获取数据[娶过来],显示数据[摆出来],响应用户事件[听她的]。下面就分别讨论这三大特征。

娶过来:
稍微有java基础的朋友应该知道,数据源的类型无非是:数据库,文件,网络。同样,在J2me体系中,也提供了这三种方式,RMS[类似于数据库的东东],文件,网络。下面分别讨论这三种方式。
RMS:
RMS的中文翻译是“记录存储系统”,偶第一次读到这个翻译的时候,觉得非常拗口,你直接说是存储数据的一种方式不就得了么。一涉及到数据存取,那么免不了增删改查,下面就一一介绍:
  
  1、打开记录集:
  打开记录集使用RecordStore里面的静态方法openRecordStore,示例代码如下:
  RecordStore rs = RecordStore.openRecordStore(“username”,true);
  
  这样就打开了一个名称为rs的记录集,其中username为记录集的名称,该名称可以根据需要来取,第二个参数代表是否在没有时创建新的记录集,true代表在该记录集不存在时,创建新的记录集,
false代表不创建。
  
  如果在打开记录集时,该记录集不存在,则抛出RecordStoreNotFoundException异常,所以检测记录集是否已创建可以使用该异常。
  
  注意:记录集打开以后记得关闭。
  
  2、向记录集中写入数据
  
  2.1增加数据
  向已经打开的记录集中添加数据,需要使用addRecord方法,示例代码:
  byte[] bytes = {1,2,3};
  int id = rs. addRecord(bytes,0,bytes.length);
  
  该代码将字节数组bytes的全部内容写入到记录集中,该方法的返回值为该信息的id,注意:id从1开始,而不是从0开始。
  你可以循环使用该方法向记录集中写入多条数据。
  
  2.2修改数据
  修改已经存在的记录集中指定id的数据,需要使用setRecord方法,示例代码:
  byte[] bytes = {1,2,3};
  rs. setRecord(1,bytes,0,bytes.length);
  
  以上代码的作用是将字节数组bytes的全部内容写入到id为1的记录集rs中。
  
  该操作会覆盖已有的数据。
  
  说明:有些时候,你需要将信息写入到记录集中的第一条记录中,则可以结合以上两个方法,则第一次时向记录集增加数据,以后来进行修改。
  
  3、从记录集中读出数据
  从记录集中读取已有数据,需要使用getRecord方法,示例代码:
  byte[] bytes = rs. getRecord(1);
  
  该代码从记录集rs中读取第一条数据,将读取到的数据放在bytes数组中。
  
  在读取数据时,可以获得记录集中id的个数,可以使用getNumRecords方法获得
  
  综合代码为:
  int number = rs. getNumRecords();
  int id = 1;
  if(id >0 && id < number){
  byte[] bytes = rs. getRecord(1);
  }
  
  4、从记录集中删除记录
  从记录集中删除记录的方法有两种:逻辑删除和物理删除。
  逻辑删除是指给删除的记录打标记。
  物理删除是指从物理上删除该记录,但是该记录的id不能被重用,也就是说该id不会被继续使用。例如一个记录集中有5个记录,假设你删除了id为3的数据,则剩余记录的id依然为1、2、4、5。这
给便历带来了一定的麻烦。
  
  5、便历记录集
  便历记录集,即访问记录集中的所有数据,有两个方法,详见:
  http://gceclub.sun.com.cn/NASApp/sme/controller/teclist?tid=0103
  
  6、其他操作
  6.1删除记录集
  删除记录集不同于删除记录,需要使用deleteRecordStore方法,示例代码:
  RecordStore. deleteRecordStore(“username”);
  
  该代码删除名称为username的记录集。


文件:
由于J2me规范中文件操作规范JSR75是可选规范,所以很多手机并不支持J2me文件操作。所以这一块跳过。不过以前做项目的时候,采取了把xml文件打包[刚才在键盘上敲打包两个字,居然敲成了打炮,
晕]到jar中,然后采用kxml2解析的方式来处理文件。


网络:
J2me中的网络连接同其他技术体系一样,也是分为长连接(Socket)和短连接(HTTP)。也不说那种类型好,那种类型效率高,应该按照自己应用的情况来选择合适的连接方式[注释:由于中国特殊情况,手
机通信分为cmnet和cmwap,但是cmwap只支持HTTP连接,所以,选择通信方式的时候,你知道的哇……]
网络通信可以说是整个J2me中比较烦的地方,首先,它牵扯了太多的利益[移动运营商,手机厂商……],大家都会涉及这一块,人多了,事情就多……
首先从外部特征来谈手机网络通信,无论你使用何种手机开发技术,进行网络编程时都不能回避接入点的处理。下面我们先来看一下各个运营商的接入点:
a)中国移动(ChinaMobile)
1)CMNET:直接连接,适用于各种网络方式,如socket、http等
如http连接的连接代码为:
HttpConnection hc = (HttpConnection)Connector.open(“http://127.0.0.1/test/1.jsp”);
2)CMWAP:代理连接,仅适用于http方式,说白了就是一个http代理服务器。
代理服务器地址:10.0.0.172
端口:80
如http连接的连接代码为:
HttpConnection hc = (HttpConnection)Connector.open(“http://10.0.0.172:80/test/1.jsp”);
hc.setRequestProperty("X-Online-Host", “127.0.0.1”);
注意:CMWAP无法使用模拟器或本机测试,必须通过手机真机测试。
b)中国联通(ChinaUnicom)
1)CUNET,同CMNET
2)CUWAP,同CMWAP
c)中国电信(ChinaTelecom)
1)CTNET,同CMNET
2)CTWAP 代理服务器地址:10.0.0.200 端口:80
接入点处理:
对于开发者来说,既然手机划分了接入点,而且不同用户默认的接入点不一样,智能机用户一般还可以选择接入点,所以在进行网络编程时就必须要处理了,下面谈一下处理的方式:
用户设置:
这种处理方式就是在软件中提供一个选项,让用户可以设置网络方式。一般默认是CMNET,如果用户连接不上,则可以在设置界面中设置为CMWAP方式。
自动适应:
这种处理方式是软件在启动时自动识别接入点,识别的原理就是连接一下,如果连接不上就认为不是这种,而换一种方式。例如默认采用CMNET方式连接,如果连接不上则认为是CMWAP。还有一种方式是在第一次启动网络连接时,同时使用CMWAP和CMNET两种方式联网,那个可以连上就认为是哪种。
接着是内部特征,也就是J2me中的网络连接实现[只阐述HTTP方式]:
网络连接重要接口:HttpConnection[代表一个HTTP连接]Connector[封装连接的获取方式] InputStream和OutputStream[读写数据到连接中],以下是一个简单例子:
1.获取连接:
HttpConnection conn = (HttpConnection) Connector.open("http://" + "....", Connector.READ_WRITE, true);
2.设置参数
conn.setRequestMethod(HttpConnection.POST);
conn.setRequestProperty("Content-Length", "");
3.写入数据
outputStream = conn.openOutputStream();
outputStream.write();
4.读取数据
inputStream = conn.openInputStream();
inputStream.read();


摆出来:
得到数据以后,把它显示出来是一个看似简单,却又非常复杂的过程[如果真的非常简单,那么那些UI设计师岂不是混日子?],在J2me生存的环境中,充斥着各种各样的设备[各种品牌的手机,PDA]
,怎么在每一种设备上都优雅的显示我们的数据是一项具有挑战性的工作。为了完成这项工作,我们有时候甚至不得不为特定的设备编写特定的界面[比如说屏幕尺寸特别大的PDA,或者屏幕特别小的破
手机,如果都使用一样的界面,视觉效果会非常差]。当然,如果你要完成一些小屁项目,demo类型的应用,那么,你可以很轻松的搞定界面问题。好了,废话就不多说了,下面来解决问题。
在J2me体系中,所有的UI类继承于Displayable[它的英文意思就是可显示的,老外还是多聪明的哇,见文知意],在Displayable下面,根据是否能直接操作屏幕,以及是否和屏幕尺寸相关,界面类
分为两大类:
高级用户界面——和屏幕大小无关,不能直接操作屏幕
高级用户界面类可以不需要修改就可以在所有支持Java的手机上显示,不同的手机显示方式会有所不同,但功能均可以正常使用。特别适合做对于界面要求不高,用户事件简单的手机应用软件。[这
里就不详细介绍了,主要原因有三点:1.简单,2.其他人都在讲,3.稍微精细的应用不会使用它]
低级用户界面——和屏幕大小相关,可以直接操作屏幕
低级用户界面可以让程序员直接操作界面,例如可以在屏幕上方便的绘制图片、文字以及基本的图形等(注1),可以在手机中表现复杂的界面,所以很适合进行手机游戏以及移动证券之类的软件开发
。但是低级界面和屏幕大小关系比较密切,所以在不同的手机型号之间实现的时候,要特别注意屏幕规划。低级用户界面主要包括两个类:
Canvas——手机画布
该类代表手机屏幕,包含获得屏幕属性(注2)、事件处理(注3)的一系列方法,以及最核心的paint绘制方法(注4)等。在MIDP2.0中该类有一个子类——GameCanvas。
Graphics——画笔
系统所有的绘制动作都通过该类实现,包含一般的绘制方法、设置字体或颜色的方法以及一些技巧操作的方法等。
低级用户界面架构可以理解为使用Graphics这样一个画笔在Canvas上进行绘制。
注1:通过Graphics对象的各种绘制方法完成
注2: 获得手机屏幕属性
getHeight——获得屏幕可用高度
getWidth——获得屏幕宽度
isDoubleBuffered——是否支持双缓冲
hasPointerEvents——是否支持指针设备
hasPointerMotionEvents——是否支持指针动作,例如拖拉事件
hasRepeatEvents——是否支持重复按键
注3: 事件处理
低级用户界面的事件处理分为两种:按键事件和指针事件(处理触摸屏手机的低级事件)。
支持按键事件的方法主要有三个:
keyPressed——按键按下的事件
keyReleased——按键释放的事件
keyRepeated——重复按键的事件
支持指针事件的方法也有三个:
pointerPressed——指针设备按下事件
pointerReleased——指针设备释放事件
pointerDragged——指针设备拖拉事件
注4:绘制方法
paint——绘制方法
repaint——重新绘制方法
paint方法需要在界面类中覆盖,然后就有了书写功能,而再需要重新绘制的时候手动调用repaint方法
上面系统的介绍了Canvas类提供的功能,下面就介绍一下它的使用。每一个J2me应用都有一个Midlet类,它的作用相当于普通java程序的main方法,是J2me程序的入口,Midlet关联了一个Display对象。
当调用Display对象的setCurrent方法显示Canvas界面时,系统首先调用Canvas对象的构造方法,然后调用paint方法实现绘制,这样我们就可以看到实际的界面了。而以后,当界面内容发生变化以后,
必须手动调用repaint方法实现绘制。
可以看出,canvas是J2me应用的高耦合点,图形绘制,用户事件处理都由它实现。


听她的:
这里也挺烦的,今天就不写了,下次单开一篇。

原文:J2me总结二
http://www.pocketcn.com/forum-viewthread-tid-1573-fromuid-1477.html

你可能感兴趣的:(j2me)