要在后台线程里对前台界面组件进行访问的解决办法:使用Display对象,Display对象主要负责管理事件循环和控制UI线程和其它线程之间的通信。
若要访问UI界面上的对象必须通过UI线程来访问,就是说在非UI线程中调用UI对象是不允许的,这是出于线程安全的考虑。
Display对象中负责调用其他线程的方法有以下3种:
1. asyncExec(Runnable runnable):异步启动新的线程。UI线程不会等待runnable对象执行结束后再继续进行,就是说UI线程可以和runnable对象所在的线程同时运行。
2. syncExec(Runnable runnable):同步启动新的线程。UI线程会等待runnable对象执行结束后才会继续进行。getSyncThread()方法可以获得线程对象。当runnable对象是耗时大的线程时,尽量不要采用此种方式。
3. timerExec(int milliseconds, Runnable runnable):指定一段时间再启动新的线程。用此方法创建的线程,将会在指定的时间后再启动线程。与UI线程是异步的。
Display对象中,与UI线程相关的方法如下:
1. 获得当前的UI线程对象:getThread()
2. 使UI线程处于休眠状态:sleep()
3. 唤醒UI线程:wake()