当前位置:  编程技术>移动开发
本页文章导读:
    ▪RMS札记        RMS笔记 RMS(Record Management System)是MIDP中一个非常重要的子系统,因为它是J2ME应用程序进行持久性存储的唯一途径。当然你的系统如果支持JSR75的话,那么你可以使用FileConnection来对文件进行操.........
    ▪ WTK 模拟器内存不足有关问题        WTK 模拟器内存不足问题 在使用WTK模拟器运行较大的程序时偶尔会报内存不足的异常,解决方法很简单,如下:   1、找到:C:\Documents and Settings\你的登录名\j2mewtk\2.5.2\wtklib\emulator.properties   2.........
    ▪ 取得触摸点的坐标       获得触摸点的坐标 @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); mCurDown = action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE; .........

[1]RMS札记
    来源: 互联网  发布时间: 2014-02-18
RMS笔记

RMS(Record Management System)是MIDP中一个非常重要的子系统,因为它是J2ME应用程序进行持久性存储的唯一途径。当然你的系统如果支持JSR75的话,那么你可以使用FileConnection来对文件进行操作。在这个包里面总共包括四个接口、一个类和五个异常。由此可见RMS设计的非常小巧,这正是为了满足移动信息设备资源受限的需求。

五个问题 1,什么是持久性存储

持久性存储简单的理解就是数据不因为程序的退出而丢失,一般我们在程序中声明的变量都是存储在stack或者heap上的,程序退出后这些数据会被清除以释放资源。而存储在RMS中的数据是不会被清除的。

2,RMS中按照Record来存储的,ID是不是等于索引

         ID和索引的区别还是很大的,ID从1开始计数,这和数组的0开始计数有一些不同。ID可以是不连续的,当一个ID标记的Record被删除后那么对应的ID也就变得无效了。ID是不能重复使用的。

3,RMS对存储数据格式没有具体的要求

只要数据可以被转换成byte[]那么这个数据就可以存储在RMS中,取出的时候仍然是byte[]。因此这就要求我们开发人员来描绘数据的样子,因为RMS只是负责把数据按照byte[]写入和读出。

4,一个MIDlet套件中的RecordStore可以被另外一个RecordStore

         在MIDP1.0中不可以,在MIDP2.0中推出了共享机制,通过共享可以实现

5,命名规则

         长度不超过32位的Unicode字符,大小写敏感且在MIDlet套件里面是唯一的。

具体使用使用

1,  首先应该清楚RecordStore就相当于一个数据库,你必须新建一个这样的数据库才可以开始使用RMS进行存储读取数据。新建RecordStore非常简单,可以使用下面的静态方法static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary) 
注意,后面的boolean类型的createIfNecessary表示,如果标记为true的时候,那么RecordStore不存在就创建它。关闭RecordStore使用closeRecordStore()。在RMS中另外一个重要的概念就是Record,这就像数据库中一行一行的数据一样。下面我们首先对RecordStore中的方法进行区分,有些是用来获得RecordStore信息的有些则是用来获得Record信息的。

(1),获得RecordStore信息
int getVersion()
int getSize()
String getName()
long getLastModified()

(2),获得Record信息
int getNumRecords()
int getNextRecordID()
int getRecordSize(int recordId)

2,对Record进行添加、修改、读取和删除。

(1),读取记录
byte[] getRecord(int recordId)
int getRecord(int recordId, byte[] buffer, int offset)

(2),添加记录
int addRecord(byte[] data, int offset, int numBytes)

(3),更新记录
setRecord(int recordId, byte[] newData, int offset, int numBytes)

(4),删除记录
deleteRecord(int recordId)

 

3, 前面我们提到了ID和Index是不同的,因为ID可能不连续,那么我们如何来遍历数据呢?很多人可能会想到使用for循环,但是由于id可能不连续,那么这个结果是无法预测的。程序很可能会失败。正是由于这样的原因,在RMS中提供了一个重要的接口RecordEnumeration。它可以遍历RecordStore中的数据。我们看看下面的方法。

RecordEnumeration enumerateRecords(RecordFilter filter, RecordComparator comparator, boolean keepUpdated)

 

在这个方法中还包括了RMS中的另外两个接口RecordFilter和RecordComparator,他们是用来量身定制遍历的结果集的,你可以实现RecordFilter来决定要把什么样的数据筛选出来,通过实现RecordComparator来决定数据的排序。最后的参数keepUpdated,如果设置为true的话,那么它会跟踪RecordStore中的数据变化,并且会反映到我们列出的结果集中,要知道这是非常好费资源的操作,建议设置为false。RecordEnumeration相当于一个双向的数据链表。你可以通过调用nextRecordId()和previousRecordId()来不停的移动。

 

4, 创建可以被共享的RecordStore
我们可以通过下面的方法来实现,必须要把authmode设置为AUTHMODE_ANY。
static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary, int authmode, boolean writable)
  

访问RecordStore
如果另外一个MIDlet Suite中的MIDlet想访问的话,那么它需要知道要访问的MIDlet suite的vendorName和suiteName,一般我们可以从jad文件中得到这两个数据。我么使用如下的方法,
static RecordStore openRecordStore(String recordStoreName, String vendorName, String suiteName) 

 

设计rms存储库(对底层方法的封装)

其实,midp已经提供了基本的操作,我们完全可以不做任何事情也照样可以实现我们的存储要求,但是,在实际开发中要是我们每遇到不同的存储数据都要我们通过流的形式来write和read的话,确实很不方便,也就是复用性太差了。所以在实际的开发中可能需要根据实际情况来封装一下底层的接口。

刚才已经说过,rms对数据格式是没有要求的,前提是你把所有的数据转化为byte[]就OK了,所以所有问题的就落实到了如何将实际数据序列化成byte[]和反byte[]为实际数据上面来了。

 

提示:

1,  我们在存储数据的时候就是把数据按照我们预先定义好的格式存放到一张表里面。

2,  表由很多个字段组成。

3,  字段由名称和属性(类型)组成。


    
[2] WTK 模拟器内存不足有关问题
    来源: 互联网  发布时间: 2014-02-18
WTK 模拟器内存不足问题

在使用WTK模拟器运行较大的程序时偶尔会报内存不足的异常,解决方法很简单,如下:

 

1、找到:C:\Documents and Settings\你的登录名\j2mewtk\2.5.2\wtklib\emulator.properties

 

2、分别设置 heap.size: 999999 和 storage.size: 999999

 

3、重启wtk emulator就可以了。

 

其中:heap.size 相当于设置模拟器所能占用的最大内存,storage.size是可用于存储的最大容量,与db有关。

 

其实在Preferences中的Storage里也可以设定,不过最大值只能是65536,用一用就会被耗尽了。这可能是为了照顾到那些古董机吧,毕竟现在出的手机标榜的就是性能,如果因为内存不足而导致的问题对于生产商而言将是一件很难看的事。

 

我尚未对linux下进行测试。

 

希望大伙补充,谢!


    
[3] 取得触摸点的坐标
    来源: 互联网  发布时间: 2014-02-18
获得触摸点的坐标
@Override public boolean onTouchEvent(MotionEvent event) { 
            int action = event.getAction(); 
            mCurDown = action == MotionEvent.ACTION_DOWN 
                    || action == MotionEvent.ACTION_MOVE; 
            int N = event.getHistorySize(); 
            for (int i=0; i<N; i++) { 
                //Log.i("TouchPaint", "Intermediate pointer #" + i); 
                drawPoint(event.getHistoricalX(i), event.getHistoricalY(i), 
                        event.getHistoricalPressure(i), 
                        event.getHistoricalSize(i)); 
            } 
            drawPoint(event.getX(), event.getY(), event.getPressure(), 
                    event.getSize()); 
            return true; 
        } 
 
private void drawPoint(float x, float y, float pressure, float size) { 
            //Log.i("TouchPaint", "Drawing: " + x + "x" + y + " p=" 
            //        + pressure + " s=" + size); 
            mCurX = (int)x; 
            mCurY = (int)y; 
            mCurPressure = pressure; 
            mCurSize = size; 
            mCurWidth = (int)(mCurSize*(getWidth()/3)); 
            if (mCurWidth < 1) mCurWidth = 1; 
            if (mCurDown && mBitmap != null) { 
                int pressureLevel = (int)(mCurPressure*255); 
                mPaint.setARGB(pressureLevel, 255, 255, 255); 
                mCanvas.drawCircle(mCurX, mCurY, mCurWidth, mPaint); 
                mRect.set(mCurX-mCurWidth-2, mCurY-mCurWidth-2, 
                        mCurX+mCurWidth+2, mCurY+mCurWidth+2); 
                invalidate(mRect); 
            } 
            mFadeSteps = 0; 
        } 

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3