当前位置: 首页 > article >正文

深入Android架构(从线程到AIDL)_12 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单线程环境),就不会产生干扰现象,也就没有线程安全问题。
  • 换句话说,如果各自使用自己的对象或变量(即不共享对象或变量),就不会干扰到别线程执行的正确性了。
  • 例如下述范例:
    // 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)。

http://www.kler.cn/a/468706.html

相关文章:

  • 防止密码爆破debian系统
  • 2024.1.5总结
  • 谈一谈对事件循环的理解
  • DeepSeek重新定义“Open“AI
  • Pytorch 三小时极限入门教程
  • PINN模型详解
  • AIGC生图实战技巧分享
  • iptable限制多个端口出站
  • C++直接内存管理new和delete
  • Kubernetes——part4-1 Kubernetes集群 服务暴露 Nginx Ingress Controller
  • frameworks 之 WallpaperManagerService 壁纸管理
  • spring mvc源码学习笔记之三
  • c语言的文件操作与文件缓冲区
  • 抖音生活服务2024年覆盖线下商家门店超610万,交易额同比提升81%
  • LeetCode 0732.我的日程安排表 III:线段树
  • [GCC]代码演示-Wl,-rpath-link链接时库搜索路径
  • 力扣hot100——动态规划 多维动态规划
  • 手动安装 Maven 依赖到本地仓库
  • Nginx:限流限速
  • 美食烹饪互动平台
  • 深入理解静态库与动态库
  • Go语言的 的并发编程(Concurrency)核心知识
  • PTA6-18 数字校验
  • MySQL和Hive中的行转列、列转行
  • Nginx——负载均衡与缓存(四/五)
  • 【开源免费】基于SpringBoot+Vue.JS海滨学院班级回忆录系统(JAVA毕业设计)