这是我参与「第四届青训营 」笔记创作活动的第11天
Service是什么
- Service是Android中实现程序后台运行的解决方案,它非常适合执行那些不需要和用户交互而 且还要求长期运行的任务。Service的运行不依赖于任何用户界面,即使程序被切换到后台,或 者用户打开了另外一个应用程序,Service仍然能够保持正常运行。
Android多线程编程
- Android多线程编程跟Java多线程编程其实差不多,基本是使用相同的语法
class MyThread : Thread() {
override fun run() {
// 编写具体的逻辑
}
}
调用它的start方法就可以启动了。
解析异步消息处理机制
Android中的异步消息处理主要由4个部分组成:Message、Handler、MessageQueue和
Looper。
01. Message
Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间
传递数据。上一小节中我们使用到了Message的what字段,除此之外还可以使用arg1和
arg2字段来携带一些整型数据,使用obj字段携带一个Object对象。
02. Handler
Handler顾名思义也就是处理者的意思,它主要是用于发送和处理消息的。发送消息一般
是使用Handler的sendMessage()方法、post()方法等,而发出的消息经过一系列地辗
转处理后,最终会传递到Handler的handleMessage()方法中。
03. MessageQueue
MessageQueue是消息队列的意思,它主要用于存放所有通过Handler发送的消息。这部
分消息会一直存在于消息队列中,等待被处理。每个线程中只会有一个MessageQueue对
象。
04. Looper
Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入
一个无限循环当中,然后每当发现MessageQueue中存在一条消息时,就会将它取出,并
传递到Handler的handleMessage()方法中。每个线程中只会有一个Looper对象。
基本步骤: 首先需要在主线程当中创建一个Handler对象,并重写 handleMessage()方法。然后当子线程中需要进行UI操作时,就创建一个Message对象,并 通过Handler将这条消息发送出去。之后这条消息会被添加到MessageQueue的队列中等待被 处理,而Looper则会一直尝试从MessageQueue中取出待处理消息,最后分发回Handler的 handleMessage()方法中。由于Handler的构造函数中我们传入了 Looper.getMainLooper(),所以此时handleMessage()方法中的代码也会在主线程中运 行,于是我们在这里就可以安心地进行UI操作了。
使用AsyncTask
不过为了更加方便我们在子线程中对UI进行操作,Android还提供了另外一些好用的工具,比如
AsyncTask。借助AsyncTask,即使你对异步消息处理机制完全不了解,也可以十分简单地从
子线程切换到主线程。当然,AsyncTask背后的实现原理也是基于异步消息处理机制的,只是
Android帮我们做了很好的封装而已。
首先来看一下AsyncTask的基本用法。由于AsyncTask是一个抽象类,所以如果我们想使用
它,就必须创建一个子类去继承它。在继承时我们可以为AsyncTask类指定3个泛型参数,
这3 个参数的用途如下。
Params。 在执行AsyncTask时需要传入的参数,可用于在后台任务中使用。
Progress。 在后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛
型作为进度单位。
Result。 当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回
值类型。