BB开发中发现了一个异常UI engine accessed without holding the event ,代码的大体结构式 一个Screen 注册到网络模块(另外一个线程)上,到网络状态发生变化,监听通知 Screen 进行UI上的变化 。
后来去网上查了一下,发现原来是由于BlackBerry的UI架构中避免多线程竞争等情况的一个机制引起的异常。BlackBerry中限定在同一时间内,只能有一个线程对UI执行更新操作,并且这个线程默认就是UiApplication子类的主线程。而其它线程如果直接试图修改UI,就会引起这个异常。
解决方法就是加入synchronized (UiApplication.getEventLock()){}代码块。
public void onConnectSuccess() { synchronized (UiApplication.getEventLock()){ boolean isLogin = RmsFacade.getChars(RmsSeed.ENCODEKEY)!=null; if(isLogin){ Intent intent = getIntent(); intent.setToScreen(TabScreen.class); intent.startScreen(); ScreenFactory.getSingleInstance().screenFinish(WelcomeScreen.class); }else{ Intent intent = getIntent(); intent.setToScreen(RegistScreen.class); intent.startScreen(); ScreenFactory.getSingleInstance().screenFinish(WelcomeScreen.class); BlzContext.getSingleInstance().netStatListener = null; } } }