我正在实现一种更新UI的方法,可以从UI线程或从其他线程执行。根据Javadocs,在后一种情况下,应使用Display.syncExec()或Display.asyncExec()方法。我必须检查我的方法是在UI线程中执行还是syncExec/asyncExec适用于这两种情况?如何实现一个在Eclipse中的UI线程和其他线程都可用的UI更新方法?
1
A
回答
1
对任何线程(包括UI线程)执行Display.syncExec/asyncExec都是安全的,但它并不总是最好的路线。例如,即使您已经在UI线程上,asyncExec也会将您的runnable添加到队列中以便稍后执行。取决于你的用例,这可能或不可取。通常,如果您知道您已经在UI线程中,最好继续并执行该工作项目。
我喜欢在任何需要更新UI的方法中使用以下代码片段,并且可能会从非UI线程调用。如果从UI线程调用,它立即执行工作。如果从其他线程调用,它使用asyncExec安排下一批次的工作而不阻塞调用线程。
public void task()
{
if(this.display.getThread() != Thread.currentThread())
{
this.display.asyncExec
(
new Runnable()
{
public void run()
{
task();
}
}
);
return;
}
// Do whatever needs to be done with the UI.
}
1
执行Display.syncExec/asyncExec
从任何线程调用时都应该是安全的,不管是否是UI。
有人可能会怀疑从UI线程调用syncExec
会导致死锁。由于syncExec
方法首先检查调用线程是否为UI线程,因此情况并非如此。如果是这样,则立即执行Runnable
的run
方法。
相关问题
- 1. 从C#中的线程更新UI的其他方法
- 2. 无法从WPF中的其他线程更新UI
- 3. 的Android如何更新从其他类(UI线程)(真的吗?)
- 4. 如何从其他线程访问主UI线程中的System.Windows.Threading.Dispatcher?
- 5. 更新UI线程
- 6. 更新UI线程
- 7. 如何在此线程中更新UI?
- 8. iOS:如何在主线程中更新UI的后台线程?
- 9. IO操作在其他线程中阻塞我的UI线程?
- 10. 如何让1个UI线程等待另一个UI线程
- 11. 如何从工作线程更新UI线程中的视图
- 12. 从另一个线程更新UI
- 13. 从另一个线程更新UI(progressDialog)
- 14. 主要Ui线程不会在方法过程中更新
- 15. 蓝牙更新UI线程
- 16. Android多线程UI更新
- 17. Cocos2D更新UI与线程
- 18. WPF MVVM - 更新UI线程
- 19. 从线程更新UI
- 20. 来自其他线程的Android UI
- 21. 如何从其他线程/代表以通用方式更新UI?
- 22. UI线程和使用处理程序的其他线程之间的通信
- 23. 在UI线程中调用parseNetworkResponse方法
- 24. Silverlight 4RC线程 - 可以一个新的线程返回UI线程
- 25. Windows.Forms.Timer实例和UI线程
- 26. 如何从线程更新UI
- 27. 如何从线程更新WPF应用程序中的UI?
- 28. 从WinRT中的线程更新UI
- 29. 新线程运行的UI线程
- 30. 的Android UI线程停止从其他线程
我目前的用例是向用户报告错误。你认为在这种情况下最好的是什么? – vitaut 2012-02-29 16:19:43
我想说,如果您已经在UI线程上,您会希望立即发生错误。如果你还没有在UI线程上,asyncExec应该没问题。 – 2012-02-29 17:44:57