Symbian 之活动对象
2010-04-20 16:03:00 来源:WEB开发网3、 ()RunL
这个函数比较复杂,它将执行大量任务:
(1) 决定下一次迭代应该做什么(加载数据或浪费时间)
(2) 检查最后一次迭代状态,并且将这个状态报告给观察器
(3) 处理所有加载的数据
一般活动对象的这个RunL()方法希望完成上述的一项或几项工作。
在这里还可以再次调用Start(),也就是说可以再次发布服务请求。
4、 在RunError()中处理错误
活动对象完全允许RunL()异常退出,结尾是“L”表明了这一点。如果该函数确实异常退出,则它异常退出时的错误码将被传递到RunError()。
TInt CCsvFileLoader::RunError(TInt aError)
{
iObserver.NotifyLoadCompleted(aError , *this);
return KErrNone;
}
这里的错误处理很简单,仅仅将错误传递给了观察器。
5、 删除未完成的请求
所有的活动对象都必须实现一个DoCancel()方法,用于删除任何未完成的请求。
void CCsvFileLoader::DoCancel()
{
if(iWastingTime || !iHaveTriedToLoad)
{
iTimeWaster.Cancel();
}
}
CActive::Cancel调用DoCancel(),绝对不允许重写CActive::Cancel()自身(它无论如何都不是虚函数),因为该函数完成了大量重要的工作。
(1) 检查活动对象是否实际上处于活动状态。如果不是,它就会返回,而不作任何事情。
(2) 调用DoCancel()
(3) 等待请求完成,这必须尽可能完成(原始请求可能在删除它之前就已经完成)
(4) 将iActive设为假。
注意:可以重写DoCancel()方法,但不可以重写Cancel()方法,这个方法会自动调用DoCancel(),另外,我们也不能直接调用 DoCancel()方法,这一点也是很重要的。
6、 析构函数
CCsvFileLoader::~CCsvFileLoader()
{
Cancel();
iFile.close();
iTimeWaster.Close();
}
任何活动对象析构函数的第一步都是调用Cancel()删除任何未完成的请求。如果删除一个带有未完成请求的活动对象,则产生一个请求迷失的严重错误。
必须关闭异步服务提供器的任何句柄,从而避免资源泄漏。
更多精彩
赞助商链接