Android编程中关于单线程模型的理解与分析

作者:Vector_Yi 时间:2022-11-11 00:34:17 

本文讲述了Android编程中关于单线程模型的理解与分析。分享给大家供大家参考,具体如下:

当一个Android程序启动时,Android系统会同时启动一个对应的主线程(Main Thread)。

由于这个主线程(Main Thread)主要的任务就是对UI相关的事件进行处理(例如显示文本,处理点击事件,显示图片等),系统对每一个组件的调用都是从主线程中分发出去的,所以又常被称为UI线程。

IMP,Android单线程模型的核心原则就是:只能在UI线程(Main Thread)中对UI进行处理。
为了提高Performance,Android对UI处理的相关method都不是synchronized,所以当你试图用其他线程来对UI进行操作时,会抛出如下异常:

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

当然,这并非鼓励我们将一切操作都放在UI线程当中进行。

有些十分费时但对UI更新影响很小的操作(如网络操作,数据库操作等),若一起放在UI线程当中去进行的话,会导致UI Performance十分poor,对的,非常非常poor,甚至弹出ANR(Application Not Responding)窗口,这无疑对用户是十分不友好的。

Ps:据我所知,Android SDK在4.0版本之后就不支持在Main Thread中直接进行网络相关操作,除非你厚颜无耻地在主线程中加上如下代码:


StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
 .detectDiskReads().detectDiskWrites().detectNetwork()
 .penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
 .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath()
 .build());

因此,Android单线程模型的原则总结起来大致有两点:

1.只能在UI线程(Main Thread)中对UI进行处理,不要在UI线程之外访问Android UI toolkit

2.不要用费时的操作阻塞UI线程

关于如何处理好Android程序中的多线程,可以参考Android官方training

希望本文所述对大家Android程序设计有所帮助。

标签:Android,单线程,模型
0
投稿

猜你喜欢

  • 浅谈Springboot下引入mybatis遇到的坑点

    2023-09-09 05:55:09
  • C#集合之列表的用法

    2021-12-27 19:46:43
  • Flutter本地存储之基本的键值对存储详解

    2023-08-18 03:52:35
  • Android Bitmap和Drawable相互转换的简单代码

    2022-01-26 11:09:01
  • SpringBoot+微信小程序实现文件上传与下载功能详解

    2023-01-17 15:56:39
  • Compose 的 Navigation组件使用示例详解

    2023-02-12 12:43:43
  • 在Spring Boot中使用Spring-data-jpa实现分页查询

    2023-12-03 21:35:39
  • SpringBoot项目打jar包与war包的详细步骤

    2022-01-12 01:28:21
  • Android实现CoverFlow效果控件的实例代码

    2023-06-23 13:12:43
  • C#实现跨线程操作控件方法

    2023-06-30 13:47:39
  • SpringBoot @NotBlank错误的解决方案

    2023-01-12 20:05:59
  • Java 切割字符串的几种方式集合

    2023-12-19 00:02:04
  • Spring容器的创建过程之如何注册BeanPostProcessor详解

    2022-02-17 08:39:09
  • Android实现在xml文件中引用自定义View的方法分析

    2021-05-28 01:43:57
  • java日期工具类实例分享

    2023-05-17 17:50:40
  • Android ViewPager实现轮播图效果

    2023-03-09 20:44:53
  • 解析android中ProgressBar的用法

    2021-07-13 20:38:52
  • Java静态泛型使用方法实例解析

    2023-03-31 00:41:35
  • Java操作redis实现增删查改功能的方法示例

    2022-01-04 07:24:24
  • 一文搞懂C#实现读写文本文件中的数据

    2021-11-07 00:21:07
  • asp之家 软件编程 m.aspxhome.com