首页 » BTalk, JAVA » BlackBerry中”UI engine accessed without holding the event lock”异常的原因分析
08

今天在用BlackBerry的Native UI库写BTalk界面时,遇到一个莫名其妙的异常:”UI engine accessed without holding the event lock”,看代码看了半天没搞清哪里抛出来的。
后来去网上查了一下,发现原来是由于BlackBerry的UI架构中避免多线程竞争等情况的一个机制引起的异常。BlackBerry中限定在同一时间内,只能有一个线程对UI执行更新操作,并且这个线程默认就是UiApplication子类的主线程。而其它线程如果直接试图修改UI,就会引起这个异常。
后来又在一个大牛的BLOG(http://rob.wemakewebsites.co.nz/index.php?p=39)上找到一个非常简单的解决方案。如果需要在非主线程中更新UI,则可以先請求Block主线程的执行,获取UI的控制权,然后更新UI,再释放控制权。大概形式如下:


synchronized (UiApplication.getEventLock()) {

   doSomethingWithUI();

   blablabla();

}

同时注意在synchronized块中不应该出现wait之类的会导致死锁的情况,所以使用应该小心。不过这个方法相对网上的很多其它通过在請求队列加入UI更新請求的方法来说,还是方便很多。至于效果和负作用,则看以后测试的情况了。

,

发表评论