| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> 线程与进程、Android多线程编程 -> 正文阅读 |
|
[移动开发]线程与进程、Android多线程编程 |
线程与进程、Android多线程编程
一、概念1.程序程序是为了实现特定任务的一系列指令的有序集合,是存放在磁盘的可执行文件。它本身没有任何运行的含义,它只是一个静态的实体。 2.进程进程是程序的一次执行过程,是一个动态的概念。 3.并发并发是多个事件在同一时间间隔内发生。 4.并行并行是多个事件在同一时刻同时进行。 5.线程线程是进程的一部分,描述指令流执行状态,它是进程中的指令执行流的最小单位。线程是进程中的一个实体,一个进程包括1 ~ n个线程。若把进程称为任务的话,那么线程则是任务中的一个子任务的执行。一个进程中可以有多个线程,他们可以并发的执行多个任务。 为啥会有线程这种东西?因为有并发进行并且共享数据的这种需求;虽然进程也可以满足这种需求,但是它的开销很大(创建进程,进程结束,进程切换… …)。而线程能减少并发执行的时间和空间开销。
二、Android中的进程与线程1.安卓的进程Android中有五种进程:前台进程,可见进程,服务进程,后台进程,空进程。 2.安卓的线程前面我们讲到,一个进程可以包含多个线程,因此进程和线程是包含与被包含的关系。简单情况下,一个进程可以只有一个线程, 即主线程。当一个应用程序启动之后,android系统会为这个应用程序创建一个主线程(Main Thread),它负责渲染视图,分发事件到响应监听器并执行,对界面进行轮询的监听,所以在Android里面主线程也叫UI线程,在UI线程里才能操作界面。 三、Android多线程编程如果我们在UI线程中做一些比较耗时的操作,比如访问网络或者数据库,都可能阻塞UI线程。对于用户来说,APP看起来像是卡住了,更坏的情况是,如果UI线程阻塞时间太长(超过5秒),Android系统会弹出ANR(application not responding)错误提示框。所以为了确保用户体验,主线程必须确保其响应速度,任何时候我们都不应该在主线程中处理非常耗时的任务,而子线程的作用就是完成耗时的操作,确保主线程的响应速度。 1.线程的创建1)继承Thread类
步骤: 2、创建该类的实例对象,即创建了线程对象; 3、调用线程对象的start()方法来启动线程,这样run()方法中的代码就会在子线程当中运行了。 下面我们通过一个java例子更好地了解一下这种创建线程的方法吧
2)实现Runnable接口(常用)上一个方法虽然代码简单,但有很大的缺点,继承Thread类后就不能再继承别的类了,所以在开发中,优先选择实现Runable接口的方式。实现的方式没有类的单继承性的局限性,且更适合用来处理多个线程有共享数据的情况。
步骤: 2、创建该类的实例对象obj; 3、将obj作为构造函数参数传入Thread类实例对象,这个对象才是真正的线程对象; 4、调用线程对象的start()方法启动该线程。 同样来看个简单的java例子吧
如果不想专门再定义一个类去实现Runnable接口,也可以使用匿名类的方式,这种写法更为常见
2. 异步消息处理机制现在我们都知道,耗时操作可以另外创建一个线程来运行以避免堵塞主线程。还有Android不允许在子线程中进行UI操作,因为Android的UI是线程不安全的(具体的原因和实践我在这里就不解释和进行了,想了解的可以上网查或看《第一行代码》)。但是有些时候,我们必须在子线程里去执行一些耗时任务,然后根据任务的执行结果来更新相应的UI控件,这该如何是好呢? Android中的异步消息处理主要由4个部分组成:Message、Handler、MessageQueue和Looper。 这里我主要介绍Message和Handler,其余的大家可以参考《第一行代码》进行学习。 1)MessageMessage是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。 2)HandlerHandler顾名思义也就是处理者的意思,它主要是用于发送和处理消息的。发送消息一般是使用Handler的sendMessage()方法,而发出的消息经过一系列地辗转处理后,最终会传递到Handler的handleMessage()方法中。Handler是主线程与子线程的通信媒介。 3)实战现在我们通过一个具体的例子来实践一下如何使用Message和Handler。新建一个ThreadTest项目,然后修改activity_main.xml中的代码,如下所示:
布局文件中定义了两个控件,Button用于改变TextView中显示的内容,我们希望在点击Button后可以把TextView中显示的字符串改成Nice to meet you。 接着我们来修改MainActivity中的代码,如下所示:
这里仅仅是为了举个例子而已,并没有涉及耗时操作,在实际开发过程中,在子线程中会进行一些耗时操作,如网络连接,下载文件,数据库操作等,然后根据这些耗时操作得到的结果来更新UI。 好啦,要讲的内容就那么多了,上面这些内容其实是Android 四大组件中服务的基础。Android/Java提供了很多类/接口来帮助大家完成异步操作,runOnUiThread()方法,AsyncTask抽象类也都常见于Android多线程编程,这些就留着让你们自己去探索啦! 参考资料: |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 17:17:51- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |