Applet托管对象的方法 【技术领域】
本发明是关于一种在计算机构件编程时托管对象的方法,尤其是指在通过Applet线程模型托管对象的方法。
背景技术
Elastos平台上进行CAR构件编程时,通过引用计数管理对象的生命周期,当不再使用一个对象时,要通过调用Release方法释放对对象的引用。但有的时候所使用的对象的生命周期要比当前线程还要长,可能在整个Applet的运行过程中都需要访问它,但又只在Applet内部使用,并且当Applet结束以后就不再需要它。如果创建这个对象的线程是Applet的主线程(Main),那么可以利用“线程托管对象”的方式将对象托管到Main线程上,因为Main线程的生命周期与Applet一样,可以保证该对象一直有效。但如果只是在一个普通线程上创建的对象,这时就比较麻烦,可以将这个对象的指针传递给Main线程,由其代为管理,或者注册Applet结束事件的回调函数,在回调函数中清理这个对象。但这些手段对用户来说都比较繁琐,如果要托管的对象很多,又可能由不同线程或者代码,甚至第三方的代码来创建的等等,都会带来操作复杂、很容易出错。
【发明内容】
鉴于以上内容,有必要提供一种Applet托管对象的方法。
该Applet托管对象的方法包括步骤:在Applet的主线程上创建一个类对象;在该类对象上实现一个托管对象链表;当Applet创建一个新对象时,将该新对象托管到该创建它的Applet的主线程上;根据该Applet的句柄将该新对象的指针插入到该托管对象链表;当Applet运行结束时,释放该类对象,进入该类对象的析构函数;在该类对象的析构函数里遍历该托管对象链表,并调用所有被托管对象的Release方法。
本发明Applet托管对象的方法提供一个托管API(应用编程接口),用户可以通过该托管API将对象托管给创建该对象的Applet,当Applet结束退出时自动调用这个对象的Release方法。利用该方式,用户不必担心对象会被提前释放,也不必实现任何多余的代码,只需要调用API托管对象即可,具有使用方便、代码清晰简洁、提高程序稳定性的优点。
【附图说明】
图1是本发明较佳实施例的Applet托管对象的方法的流程图。
图2是本发明Applet Main线程和类对象CAutoRelease及托管对象链表之间的关系示意图。
【具体实施方式】
如图1所示,是本发明较佳实施例的Applet托管对象的方法的流程图。
步骤S200,在Applet的主线程(Main)上创建一个类对象CAutoRelease,并在该Applet上保留该类对象CAutoRelease的对象指针。该类对象CAutoRelease用于管理被托管的对象。
步骤S202,在这个创建的类对象CAutoRelease上实现一个托管对象链表。
参照图2所示,其中Main1是Applet的主线程,类对象CAutoRelease10是在该Main1上创建的用于管理被托管对象的一个类对象CAutoRelease,托管对象链表11是在该类对象CAutoRelease上实现的一个托管对象链表。
例如用下面一段程序代码(AA)实现上述功能:
Class CAutoRelease//用于管理被托管的对象
{……}
Applet TFoo{
Public:
CAutoRelease *m_pAutoRelease;//在Applet上保留一个
CAutoRelease的对象指针
}
TFoo::AppletRoutine(…)//Applet的Main线程
{
m_pAuRelease=new CAutoRelease;//在Applet主线程上创建
一个CAutoRelease对象
……;//执行Applet的其它操作直到准备退出Applet
delete m_pAutoRelease;//准备退出Applet,清理托管对象
……
}
通过上述步骤S200和S202,本发明实现了Applet线程上的托管API(Application Programming Interface,应用编程接口)。
步骤S204,当Applet创建一个对象时,用户调用所述托管API将这个新创建的对象托管到该创建它的Applet的主线程上。
步骤S206,用户获得该Applet的句柄。在Elastos平台上,所有的代码都分别运行于各个Applet,基于Applet地特性,所有运行于Applet内的线程的TLS(Thread Local Storage,线程本地存储或线程局部存储)上都保存着Applet的句柄,因此,用户可以随时获得Applet的句柄。
步骤S208,根据所获得的Applet的句柄,用户将所创建的对象的指针插入到上述所实现的托管对象链表中,也即将该所创建的对象托管到了所述CAutoRelease类对象上。
例如可用下面程序段实现将对象插入到托管对象链表上的功能:
ECode CObj ect::ReleaseAtAppletFinish(PInterface pObject)//托管API实现的伪代码
{
CApplet::GetCurrent(&pApplet);//获取当前Applet的句柄
pApplet->m_pAutoRelease->GetList(&pList);//从Applet对象上
获取托管对象链表
pList->Insert(pObject);//将托管对象插入链表
return Noerror;
}
步骤S210,当Applet运行结束时,释放类对象CAutoRelease,此时进入该类对象CAutoRelease的析构函数。析构函数的作用即是当对象生命期结束后,收回对象所占用的资源。
步骤S212,在该类对象CAutoRelease的析构函数里遍历托管对象链表,并调用所有被托管对象的Release方法。
例如可用下面一段程序代码实现释放被托管对象的功能:
CAutoRelease::~CAutoRelease()//CAutoRelease的析构函数
{
pList=m_pList-First();//开始遍历托管链表
While(pList){//遍历托管对象链表,并释放被托管对象
pList->GetCurrent(&pObj);//获得一个托管对象
pObj->Release();//释放被托管对象
pList=pList->Next();//继续遍历链表
}
Delete m_plist;//释放链表资源
}
利用本发明所提供的Applet托管对象的方法,可通过Elastos平台的托管API CObject::ReleaseAtAppletFinish()达到托管对象的目的,如下面一段程序代码段片断所示:
ECode UserRoutine(…)
{
CFoo::New(&pFoo);
CFoo::AddFooEventCallback(pFoo,&OnFooEvent);//注册
FooEvent事件的回调
CObject::ReleaseAtAppletFinish(pFoo);//Applet托管API,实现
了对CFoo对象的托管)
}
ECode TFoo::Main(…)//某个Applet的Main方法
{
CThread::New(&UserRoutine,…);
Return NOEROR;
}
从上面的代码段可以看出,线程函数UserRoutine创建一个CFoo对象以后,将这个对象通过托管API注册给Applet,之后继续其它操作,或者直接退出线程,不需再考虑这个对象的释放操作。当这个Applet退出时,系统会自动调用CFoo的Release方法,正好对应CFoo::New的操作。
如果有多个对象需要被托管,可以反复调用这个托管API。
有了这种托管对象的方式,用户可以通过一个托管API将对象托管给创建该对象的Applet,当Applet结束退出时自动调用这个对象的Release方法。利用该方法,用户不必担心对象会被提前释放,也不必实现任何多余的代码,只需要调用API托管对象即可,具有使用方便、代码清晰简洁、提高程序稳定性的优点。