当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。
在开发Android 应用时必须遵守单线程模型的原则:
1. 不要阻塞UI线程
2. 确保只在UI线程中访问Android UI工具包
如果在非UI线程中直接操作UI线程,会抛出android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views,这与普通的java程序不同。
由于UI线程负责事件的监听和绘图,因此,必须保证UI线程能够随时响应用户的需求,UI线程里的操作应该向中断事件那样短小,费时的操作(如网络连接)需要另开线程,否则,如果UI线程超过5s没有响应用户请求,会弹出对话框提醒用户终止应用程序。
原则一:
不要阻塞主线程,比如说我最近遇见的要让程序sleep几秒,开始是直接在主线程中添加了Thread.sleep结果发现所有的UI都要等sleep完成之后才会显示出来,这就是因为违背了阻塞主线程的原则,解决办法就是开一个新的线程单独去做sleep的动作,同样的道理遇见很耗时的操作时也要避免放在主线程中。
原则二,确保只在UI线程中访问Android UI工具包
目前遇见的在非主线程中直接更新UI的方法只有postinvalidate
android提供了几种在其他线程中访问UI线程的方法。
Activity.runOnUiThread( Runnable )
View.post( Runnable )
View.postDelayed( Runnable, long )
Hanlder
这些类或方法同样会使你的代码很复杂很难理解。然而当你需要实现一些很复杂的操作并需要频繁地更新UI时这会变得更糟糕。
参考了资料:http://www.oschina.net/question/163910_27115
http://www.cnblogs.com/nio-nio/archive/2012/07/23/2604900.html