Android线程安全问题总结
2017-02-17 15:52
225 查看
线程安全的定义
线程安全:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的,或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题 。Android的单线程模型
当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行 。主线程(Main Thread)主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事 件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。系统不会为每个组件单独创建线程,在同一个进程里的UI组件都会在UI线程里实例化,系统对每一个组件的调用都从UI线程分发出去。结果就是,响应系统回调的方法(比如响应用户动作的onKeyDown()和各种生命周期回调)永远都是在UI线程里运行。
UI线程才能与Android UI工具包中的组件进行交互,在开发Android应用时必须遵守单线程模型的原则:
1. Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。
2.不要阻塞UI线程。
为什么说Android UI不是线程安全的?
android UI 中提供invalidate()来更新界面,而invalidate()方法是线程不安全。Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在非UI主线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。例如:在非UI线程中调用invalidate会导致线程不安全,也就是说可能在非UI线程中刷新界面的时候,UI线程(或者其他非UI线程)也在刷新界面,这样就导致多个界面刷新的操作不能同步,导致线程不安全
相关文章推荐
- 基于Android中Looper , Handler , Message的线程池,轻松解决Sqlite数据库的线程安全问题
- Android Handler 发送消息的线程安全问题
- Android下数据库线程安全问题
- Android开发设计模式之——单例模式关于线程不安全问题处理
- Android app security安全问题总结
- 总结: Struts2 + Spring 的线程安全问题
- javaweb学习总结二十三(servlet开发之线程安全问题)
- volatile关键字的线程安全问题总结
- Servlet线程安全问题学习总结
- Android基础学习总结(八)——Toast应用与分线程弹Toast问题
- Android app security安全问题总结
- 关于Android的View线程安全的问题
- 线程安全问题总结
- Android线程安全问题分析与解决
- GTK+的线程安全问题
- 程序中和有js函数的网页交互,线程中调用 get_Script 就会错误的解决方法,由于COM的线程安全问题
- C#线程相关问题总结:基本操作及UI控件交互
- action的线程安全问题
- 线程间控件安全访问问题
- 线程安全问题