为什么说invalidate()不能直接在线程中调用
2014-10-18 19:11
253 查看
1、为什么说invalidate()不能直接在线程中调用?
2、它是怎么违背单线程的?
3、android ui为什么说不是线程安全的?
4、android ui操作为什么一定要在UI线程中执行?
1、为什么说invalidate()不能直接在线程中调用?
答:
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在非UI主线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。例如:在非UI线程中调用invalidate会导致线程不安全,也就是说可能在非UI线程中刷新界面的时候,UI线程(或者其他非UI线程)也在刷新界面,这样就导致多个界面刷新的操作不能同步,导致线程不安全
2、它是怎么违背单线程的?
答:一个 Android 程序开始运行时,就有一个主线程Main Thread被创建。该线程主要负责UI界面的显示、更新和控件交互,所以又叫UI Thread。由于只有UI线程更新界面所以说
Android是单线程模型。 一个Android程序创建之初,一个Process呈现的是单线程模型--即Main Thread,在非主线程(UI线程)外调invalidate()刷新界面出现异常,即是说用其他的线程更新UI,android中是不被允许的。
3、android ui为什么说不是线程安全的?
答:android UI 中提供invalidate()来更新界面,而invalidate()方法是线程不安全。
4、android ui操作为什么一定要在UI线程中执行?
答:UI主线程是更新UI界面的,更新了界面才能看到运行的效果。
再者Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。如果在子线程中直接修改UI,会导致异常。
FROM:http://chenjinhua1595515.blog.163.com/blog/static/21583214720140834012400/
相关文章推荐
- 为什么说invalidate()不能直接在线程中调用
- 调用线程对象的start()方法会执行run(),为什么不能直接调用run()方法??
- MFC:线程中更新窗口不能直接调用UpdateData函数
- 为什么我们调用start()方法时会执行run()方法?为什么我们不能直接调用run()方法?他们之间有什么区别?
- 为什么在一个线程中不能调用显示另一个窗体?
- 浅析为什么设置用户ID程序中不能直接调用system函数?
- 线程中更新窗口不能直接调用UpdateData函数
- 主线程不能直接调用webservice方法
- 为什么不能直接在BroadCastReceiver中开一个线程执行耗时任务
- 线程中更新窗口不能直接调用UpdateData函数 的解决办法
- 线程中更新窗口不能直接调用UpdateData函数
- java中静态方法中为什么不能使用this、super和直接调用非静态方法
- 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
- 线程中更新窗口不能直接调用UpdateData函数
- 多线程:创建Thread为什么要调用start启动,而不能直接调用run方法
- 为什么unity不能调用含有GL线程的dll库
- c++中非静态函数不能用类名调用,为什么CWnd的成员函数GetDC()可以直接调用啊?
- 线程中更新窗口不能直接调用UpdateData函数
- MainActivity中为什么不能在自己创建的线程中调用控件的方法?
- 为什么线程不能调用fork