目录
6、 Android UI 单线程程序
單線程程序概念
单线程可避免线程安全问题
SurfaceView与非UI线程
6、 Android UI 单线程程序
單線程程序概念
- 单线程程序意谓着两个(或多个)线程不能共享对象或变量值。
- Android的UI是单线程程序的环境。
- UI控件(如Button等)都是由UI线程所创建,内部攸关于UI显示的属性或变量都只有UI线程才能存取(Access)之,别的线程并不能去存取之。
- 例如下图里的View类别体系,都只限于UI线程才能去执行它们的onDraw()函数,因为它会实际更动到UI的属性。
- 由于UI线程来执行onCreate()函数,诞生了Button对象,因而只限UI线程能去存取该对象里攸关UI的属性,其它线程不能去碰它们。
单线程可避免线程安全问题
- 线程安全问题就是如何避免不同线程之间,可能会相互干扰的问题。
- 虽然两个线程几乎同时先后执行一个类别里的(可能不同)函数,只要不共享对象、或共享变量(例如Android的UI单线程环境),就不会产生干扰现象,也就没有线程安全问题。
- 换句话说,如果各自使用自己的对象或变量(即不共享对象或变量),就不会干扰到别线程执行的正确性了。
- 例如下述范例:
// Ex01.java class Task2{ private int count; public void init(){ count = 0; } public void f1() { for(int i=0; i<3; i++) { count++; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() +"'s count: " + count); } } } class Task implements Runnable { public void run() { Task2 ta2 = new Task2(); ta2.init(); ta2.f1(); } } public class JMain { public static void main(String[] args) { Task ta = new Task(); Thread t1 = new Thread( ta, "A"); Thread t2 = new Thread( ta, "B"); t1.start(); t2.start(); System.out.println("Waiting..."); } }
这里, t1和t2线程共享主线程所诞生的ta对象,但是各自诞生了Task2类别之对象。两者各自使用自己的对象(即不共享对象或变量),就不会干扰到别线程的数据。所以输出正确的结果:
Waiting...
B's count: 1
A's count: 1
B's count: 2
A's count: 2
B's count: 3
A's count: 3
SurfaceView与非UI线程
- View控件是由UI 线程(主线程)所执行。如果需要去迅速更新UI画面或者UI画图需要较长时间(避免阻塞主线程),就使用SurfaceView。
- 它可以由背景线程(background thead)来执行,而View只能由UI(主)线程执行画面显示或更新。
- 在SurfaceView里,非UI线程可以去碰触UI显示,例如将图形绘制于Surface画布上。这SurfaceView内含高效率的rendering机制,能让背景线程快速更新surface的内容,适合演示动画(animation)。