Android - 线程 Thread

news/2024/10/17 8:27:17/

一、概念

1.1  主线程

一个线程总是由另一个线程启动,所以总有一条特殊的线程即主线程。

1.2 UI线程

APP启动时系统会为它创建一条执行线程即主线程,主线程用来处理所有与用户界面相关的操作(触摸、布局、绘制、动画)以及UI组件的声明周期(创建、销毁、更新),因此也称为UI线程。

1.3 子线程(工作线程)

        多线程并发访问同一个资源会发生竞态条件或死锁问题,为了性能和稳定性 Android 将UI框架设计为单线程的时间队列模型(采用一个专门的线程从队列中抽取事件并将它们转发到应用程序定义的事件处理器),会在 ViewRootImpl 中调用 checkThread() 方法检测是否是在UI线程中更新UI。因此不要阻塞UI线程、不要在子线程中访问UI,会容易引发ANR(Application Not Response)异常。

1.3.1 不要阻塞UI线程

即不要在主线程中做耗时任务,同一进程中的所有组件都是在UI线程中实例化的,以下分别对应该组件中的线程被阻塞多少秒后会报ANR异常。

Activity5秒。
Broadcast前台10秒、后台60秒。
Service前台20秒、后台200秒。
ContentProvider10秒。
Input5秒。

1.3.2 不要在子线程中访问UI

由于不能阻塞主线程,可以使用子线程来做耗时操作(图片加载,网络请求等),由于不能在非UI线程上更新界面,可以使用以下几种方法来更新:

Activitypublic final void runOnUiThread(Runnable action)
Handler

public final boolean post(Runnable r)

public final boolean postDelayed(Runnable r, long delayMillis) 

View

public boolean post(Runnable action)

boolean postDelayed(Runnable action, long delayMillis)

Kotlin Coroutine协程调度器指定Dispatcher.Main
Thread {runOnUiThread {textView.text = ""}textView.post {textView.text = ""}Handler(Looper.getMainLooper()).post {textView.text = ""}CoroutineScope(Dispatchers.Main).launch {textView.text = ""}
}.start()

http://www.ppmy.cn/news/157695.html

相关文章

音视频基础 及 海思sample_venc解读

1、sample的整体架构 (1)sample其实是很多个例程,所以有很多个main (2)每一个例程面向一个典型应用,common是通用性主体函数,我们只分析venc (3)基本的架构是:venc中的main调用venc中的功能函数,再调用common中的功…

linux中断

一 Linux中断原理 Linux中断(Interrupt)是指在计算机执行过程中,由于某些事件发生(例如硬件请求、错误、异常等),CPU暂停当前正在执行的程序,转而执行相应的处理程序的过程。中断是计算机多任务…

java虚拟机性能分析和故障解决工具

一:工具概述 二:命令行工具 jps(jvm process status tool):显示指定系统内所有虚拟机的进程。 jstat(jvm statices monitoring tools):用于收集虚拟机各方面的运行数据。 jinfo(configuration info for ja…

【Web开发技术】JWT令牌技术(信息安全)

文章目录 一、描述二、依赖三、配置四、java文件中的准备五、开始使用 一、描述 说到JWT令牌技术,就需要提到cookie和session两种技术。这两种技术在跨域问题(计算机网络的知识,百度可以搜到,就回归重点)上存在一定的局…

申请图形商标后为什么还要申请美术作品版权?

申请图形商标后为什么还要申请美术作品版权?很多申请人认为申请图形商标后,就没有登记美术作品版权的必要性,但并非如此,今天,智产易就带大家详细了解一下! 规避不必要的风险 商标和美术作品著作权不属于…

泰拉瑞亚ce不用重铸修改攻速,改物品,改攻击等

找物品数量不用教了吧,找到后可以通过各种方式找到指向该格子的指针(推荐指针扫描,当时我选的偏移9,范围10000,偏移太少可能扫不出来),接着把武器放到格子里浏览内存地址照着表改就行。 上面有…

gg修改器修改数值没有用怎么办_gg修改器如何使用?gg修改器使用方法

gg修改器如何使用?gg修改器是一款非常好用的手游数值修改软件,很多刚下载这款软件的用户,还不怎么会用这款软件,下面就给大家分享gg修改器使用方法,一起来看看吧! 使用方法 1、打开修改器,给修改…

用java写修改器_一些修改器1

1、增加:$inc db.mycoll.update({}, {"$inc":{"mykey":10}}); 2、设置:$set db.mycoll.update({"name":"BuleRiver"}, {"$set":{"name":"BuleRiver2"}}); 3、数组修改器&#xf…