WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章手机编程BREWBREW & J2ME:在差别中联合

BREW & J2ME:在差别中联合
作者:佚名  来源:本站整理  发布时间:2008-4-8 1:14:52



下一个概念就是事件处理。显然,BREW 和Java之间存在的重要差别包括:一个唯一的ID、事件循环机制配对一个固有的,基于监视器的机制。我说“显然”,那是因为机制之间可以自由切换。甚至J2ME可以共享BREW的缺陷——命令听取者的实现与BREW事件循环紧密关联——这个缺陷通常是一个难于维护的、巨大的“转换”。在此之上,听取者是一个类型很差的构造,它暴露一个不得不被用户抛弃的Displayable接口。我们的框架提供一个更安全的方法,它拥有类型安全的、J2SE风格的听取者。例如, ListImpl 类可定义一个听取者:
 

JAVA手机网[www.cnjm.net]


CODE:typedef bool (T::*FNC)(ListImpl<T,P,E>*);


实现如下:

CODE:bool myListUsage( List* l)
 

{
int pos = l->getSelectedIndex();
return (pos == INDEX_OUT_OF_BOUNDS) ?
false : BuildCommand(pos), true;
}


并且登记如下:

CODE:l->setCommandListener(myListUsage);


 

JAVA手机网[www.cnjm.net]

Java有一个更好的getSelected() 机制来取代传送到IMENUCTL_AddItem 的唯一标志。通过使用普遍存在的DisplayableRegistry,我们可以很容易的实现它,这段时间内产生的唯一标志在内部可作为ID使用。请注意在某些特殊的情况下使用政策可加快ID的检索。

BREW 和Java之间的一个明显差别在于故障处理,基于RTTI的异常处理在BREW中不可用或者使用成本过高。使用setjmp/longjmp 模拟try/catch机制由于销毁自动对象有问题不能直接应用,但是其他的技能是可用的。为了方便,我们将ErrorHandler当作政策——适当提供异常追踪信息的一种方式——来提供。

包装

让我们使用上述技巧从头开始写一个应用程序。

框架封装在cppapp和brewJ2ME内。一个应用就是一个类——与文件MyApp.h 中的Midlet差不多。以下是编写应用的步骤:

1.将 "MyApp.h"包括在cppapp.h之内。

2.创建一个继承于IMidlet 的Midlet 类。

3.将APPLICATION_TYPE 的类型定义为 Midlet。

结果产生的框架为:

CODE:class Midlet : public IMidlet
{
};
typedef Midlet APPLICATION_TYPE ;



我们的简单应用将处理两个清单,每一个都包含四项——{"1","2","3","4"} 和{"A","B","C","D"}。例如,按下"1,",我们将看到相应的"A," ,按下 "C" 就转换为"3,",以此类推。这种逻辑可嵌入到两个事件处理器内:my14ListUsage和myADListUsage。

CODE:class Midlet : public IMidlet
{
typedef ListImpl<Midlet> List;
private:
bool my14ListUsage( List* l)
 

{
 

int pos = l->getSelectedIndex();
return (pos == INDEX_OUT_OF_BOUNDS) ?
false : BuildADList(pos), true;
}
bool myADListUsage( List* l)
 

{
int pos = l->getSelectedIndex();
return (pos == INDEX_OUT_OF_BOUNDS) ?
false : Build14List(pos), true;
}
List * Init14List()
{
List* l = List::getList("List14", this);
if (!l) return 0;
l->setCbk(my14ListUsage);
 

WString a[] = {"1","2","3","4"};
l->append(a,SIZE_OF(a));
return l;
 

}
List * InitADList()
{
List* l = List::getList("ListAD", this);
if (!l) return 0;
l->setCbk(myADListUsage);
WString a[] = {"A","B","C","D"};
l->append(a,SIZE_OF(a));
return l;
}
void BuildADList(int ix )
{
if (!lAD_)
{
lAD_ =InitADList();
 

}
BuildList(lAD_, ix);
}
void Build14List(int ix )
{
if (!l14_)
 

{
l14_ = Init14List();
}
BuildList(l14_, ix);
 

}
void BuildList(List* l , int ix)
{
if (!l || (l->size()-1)<ix) return;
l->setSelection(ix);
 

getDisplayable()->setCurrent(l);
}
public:
virtual bool onStart()
{
l14_ = 0;
lAD_ = 0;
BuildADList(2);
return true;
}
private:
List* l14_;
List* lAD_;
};
 




我们真正感兴趣的不是代码的明显简化,而是事件处理的透明性。

上一页  [1] [2] [3] [4] [5]  下一页

[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码