深入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.mzph.cn/web/65219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32-笔记36-ADC(模拟/数字转换器)

一、什么是ADC&#xff1f; 全称&#xff1a;Analog-to-Digital Converter&#xff0c;指模拟/数字转换器。 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁。 12 位 ADC 是一种逐次逼近型模拟数字转换器&#xff08;0…

房产销售系统(源码+数据库+文档)

亲测完美运行带论文&#xff1a;文末获取源码 文章目录 项目简介&#xff08;论文摘要&#xff09;运行视频包含的文件列表&#xff08;含论文&#xff09;前端运行截图后端运行截图 项目简介&#xff08;论文摘要&#xff09; 随着科学技术的飞速发展&#xff0c;各行各业都在…

游戏社交趋势下,游戏语音再升级!

如今&#xff0c;游戏已成为我们社交生活的一个重要娱乐方式&#xff0c;春节临近&#xff0c;与亲朋好友一起畅玩“开黑”无疑是节假日的一大乐趣。在游戏社交互动中&#xff0c;“游戏语音”不可或缺。在传统游戏语音领域&#xff0c;多人在线游戏如 MOBA、FPS 和 MMORPG 的实…

HTML5实现好看的博客网站、通用大作业网页模板源码

HTML5实现好看的博客网站、通用大作业网页模板源码 前言一、设计来源1.1 主界面1.2 列表界面1.3 文章界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的博客网站、通用大作业网页模板源码&#xff0c;博客网站源码&#xff0c;HTML模板源码&#xff0…

ArcGIS中怎么把数据提取到指定范围(裁剪、掩膜提取)

最近&#xff0c;经常能收到怎么把数据提取到指定范围、栅格数据怎么裁剪、矢量数据怎么裁剪、栅格数据怎么掩膜提取的咨询。 下面是我对这个问题的解决思路&#xff1a; 对于矢量数据&#xff1a; ①首先把数据加载进来 ②软件界面上面的工具栏找到→地理处理→裁剪&#x…

PHP 使用集合 处理复杂数据 提升开发效率

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…

(转)rabbitmq怎么保证消息不丢失?

RabbitMQ 可以通过以下多种机制来保证消息不丢失&#xff1a; 生产阶段 - 持久化队列和交换器&#xff1a; - 在声明队列和交换器时&#xff0c;将 durable 参数设置为 true &#xff0c;确保它们是持久化的。这样&#xff0c;即使 RabbitMQ 节点重新启动&#xff0c;队列和交…

node.js内置模块之---stream 模块

stream 模块的作用 在 Node.js 中&#xff0c;stream 模块是一个用于处理流&#xff08;stream&#xff09;的核心模块。流是一种处理数据的抽象方式&#xff0c;允许程序处理大量数据时不会一次性将所有数据加载到内存中&#xff0c;从而提高性能和内存效率。通过流&#xff0…

手持PDA终端,提升零售门店管理效率

随着科技的不断进步和零售行业的持续发展&#xff0c;手持PDA终端的应用将会越来越广泛。它将不断融合更多先进的技术和功能&#xff0c;为零售门店管理带来更加便捷、高效、智能的解决方案。 手持PDA终端是集成了数据处理、条码扫描、无线通信等多种功能于一体的便携式设备‌…

LeetCode -Hot100 - 53. 最大子数组和

前言 本专栏主要通过“LeetCode 热题100”&#xff0c;来捡起自己本科阶段的算法知识与技巧。语言主要使用c/java。如果同样正在练习LeetCode 热题100的朋友欢迎关注或订阅本专栏。有疑问欢迎留言交流~ 题目描述 题目链接 示例 1&#xff1a; 输入&#xff1a;nums [-2,1…

【51单片机-零基础chapter1】

安装软件(配套的有,不多赘述) 1.管理员身份运行keil和破解软件kegen 将CID代码复制粘贴到 一定要管理员方式,不然会error 插入板子 我的电脑,管理 1.如果是拯救者,查看端口,如果没有则显示隐藏 2.苹果不知道,好像不可以 3.其他电脑在"其他设备找" (注:本人在校已…

Go语言的 的设计模式(Design Patterns)基础知识

Go语言的设计模式基础知识 引言 设计模式是一种在软件开发中经常使用的解决特定问题的通用方案。它们为开发者提供了一种有效的方式来组织代码、提高代码的可复用性、可维护性和灵活性。在众多编程语言中&#xff0c;Go语言因其独特的特性&#xff0c;如并发支持和简洁的语法…

使用JMeter玩转tidb压测

作者&#xff1a; du拉松 原文来源&#xff1a; https://tidb.net/blog/3f1ada39 一、前言 tidb是mysql协议的&#xff0c;所以在使用过程中使用tidb的相关工具连接即可。因为jmeter是java开发的相关工具&#xff0c;直接使用mysql的jdbc驱动包即可。 二、linux下安装jmet…

C# 设计模式(结构型模式):外观模式

C# 设计模式&#xff08;结构型模式&#xff09;&#xff1a;外观模式 (Facade Pattern) 在复杂系统中&#xff0c;往往会涉及到多个子系统、模块和类。这些子系统的接口和功能可能会让使用者感到困惑和复杂。在这种情况下&#xff0c;我们可以使用外观模式&#xff08;Facade…

计算机网络常见面试题及解答

以下是计算机网络中常见的面试题及解答&#xff0c;按主题分类&#xff1a; --- ## **一、基础概念** ### **1. OSI 七层模型和 TCP/IP 模型的区别是什么&#xff1f;** **答&#xff1a;** - **OSI 七层模型&#xff1a;** - 应用层、表示层、会话层、传输层、网络层、数…

Win11+WLS Ubuntu 鸿蒙开发环境搭建(一)

参考文章 Windows11安装linux子系统 WSL子系统迁移、备份与导入全攻略 如何扩展 WSL 2 虚拟硬盘的大小 Win10安装的WSL子系统占用磁盘空间过大如何释放 《Ubuntu — 调整文件系统大小命令resize2fs》 penHarmony南向开发笔记&#xff08;一&#xff09;开发环境搭建 一&a…

微信小程序提示 miniprogram-recycle-view 引入失败

npm i --save miniprogram-recycle-view 安装需要使用的页面的json文件中配置 {"usingComponents": {"recycle-view": "miniprogram-recycle-view/recycle-view","recycle-item": "miniprogram-recycle-view/recycle-item"…

基于深度学习算法的AI图像视觉检测

基于人工智能和深度学习方法的现代计算机视觉技术在过去10年里取得了显著进展。如今&#xff0c;它被广泛用于图像分类、人脸识别、图像中物体的识别等。那么什么是深度学习&#xff1f;深度学习是如何应用在视觉检测上的呢&#xff1f; 什么是深度学习&#xff1f; 深度学习是…

Go语言的 的基本数据类型(Primitive Data Types)核心知识

Go语言的基本数据类型&#xff08;Primitive Data Types&#xff09;核心知识 Go语言&#xff08;又称Golang&#xff09;是一种开源编程语言&#xff0c;由Google设计并开发。它以高效、简洁和强大的并发支持著称。Go语言支持多种数据类型&#xff0c;其中基本数据类型是构建…

ElasticSearch基础-文章目录

ElasticSearch学习总结1&#xff08;环境安装&#xff09; ElasticSearch学习总结2&#xff08;基础查询&#xff09; ElasticSearch学习总结3&#xff08;.NetCore操作ES&#xff09; ElasticSearch学习总结4&#xff08;sql操作ES&#xff09; ElasticSearch学习总结5&am…