深入Android架构(从线程到AIDL)_12 Android UI 单线程程序

目录

[6、 Android UI 单线程程序](#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单线程环境),就不会产生干扰现象,也就没有线程安全问题。

  • 换句话说,如果各自使用自己的对象或变量(即不共享对象或变量),就不会干扰到别线程执行的正确性了。

  • 例如下述范例:

    java 复制代码
    // 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)。
相关推荐
IvanCodes8 分钟前
MySQL 视图
android·数据库·sql·mysql·oracle
KevinWang_12 分钟前
Java 和 Kotlin 混编导致的 bug
android·kotlin
好学人27 分钟前
Android动画系统全面解析
android
leverge200929 分钟前
android studio 运行java main报错
android·ide·android studio
RichardLai8830 分钟前
Flutter 环境搭建
android·flutter
思想觉悟40 分钟前
ubuntu编译android12源码
android·ubuntu·源码
好学人1 小时前
Android自定义控件事件传递机制
android
V少年1 小时前
深入浅出 C++ 标准库
android
V少年1 小时前
深入浅出 C++ 特有关键字
android
weixin_432989551 小时前
Kotlin delay方法解析
android·开发语言·kotlin