1、阻塞应用程序
由于活动对象的运行是非抢占式的,一旦有活动对象的RunL()被执行,那么别的活动对象只能等待RunL()执行完成后才能执行,因此RunL()的代码段长度一旦过长或是执行长时间的运算,就会阻塞应用程序,造成延时。
2、信号的迷失
简单的说就是活动对象调度器收到了来自服务提供者的异步事件,但是找不到对应得活动对象来执行,就好比服务员从厨师那里端上顾客点的菜却找不到是哪个顾客的。出现E32USER-CBASE 46时表明是活动对象的迷失信号错误。导致这个错误产生的原因有以下几点:
活动对象没有添加到调度器中,却发送了异步请求。一旦异步请求发送成功,服务提供者就会接受该服务,并按照要求执行,因此在执行完成后,调度器却找不到对应的活动对象,造成信号的迷失。
活动对象发送异步请求后没有执行SetActive(),因此活动状态始终是 EFalse,因此调度器就找不到了。
活动对象在销毁之前没有调用Cancel(),以至于自己不存在了但是服务仍然进行,当服务完成后自然找不到对应的活动对象。
活动对象在活动状态时又接着发送请求,这样会有两个异步事件,由于活动对象处理完第一个后的状态已经被设为EFalse ,因此在第二个服务到来时却没有活动对象了。
总之,Symbian OS的 App使用活动对象机制来处理所有的异步事件,他是Symbian的一大特色,实际上应用程序中几乎所有的函数都是直接或者间接的被活动对象的RunL调用的。在Symbian的学习和工作过程中不可避免的会遇到关于活动对象的诸多问题,这些是参考和经验,要想更深刻的理解并用好活动对象必须要有自己的实践,希望大家能够掌握Symbian 中这一极具特色的东西,为自己的Symbian开发增添色彩。