handler机制
可实现:子线程跟主线程相互通信
实现原理:每个线程都有一个Looper,Looper会轮询消息队列MessageQueue中的消息,Handler可以关联这个Looper,关联的Looper是哪个线程就向哪个线程发送消息。
广播
原理:广播接收者通过Binder机制向AMS(Android Manager Sevice)进行注册,广播发送者通过Binder机制向AMS发送广播,AMS查找相应的广播接收器,找到后调用广播接收器的onReceive。至于不同的广播,具体实现会有不同,但总体流程大致一样。
默认运行在主线程,但也可以运行在子线程,如动态注册的时候,这里可以传入一个Handler,这个Handler就可以是其他线程创建的,这样就可以在其他线程运行Broadcast。
public abstract Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, @Nullable String broadcastPermission,@Nullable Handler scheduler)
EventBus事件总线
EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化Android事件传递。EventBus可以代替Android传统的Intent、Handler、Broadcast或接口回调,在Fragment、Activity、Service线程之间传递数据,执行方法。
定义事件类
注册、取消订阅
定义事件方法并加上注解@Subscribe参数
threadMode
ThreadMode.POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR.
ThreadMode.MAIN: 事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。
ThreadMode.BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
ThreadMode.ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。
priority
订阅方法的优先级影响订阅方法的执行顺序。优先级越高越被先执行。
sticky
如果设置为true
则该订阅事件为粘性事件。stick 事件就是如果某个对象的stick 事件被发布后,该对象的stick订阅事件没有注册到EvnetBus上,当该对象的stick订阅事件注册到EventBus上时, 该对象的订阅事件将立即被执行。发布事件
Rxjava
RxJava是响应式编程(Reactive Extensions)的java实现,它基于观察者模式的实现了异步编程接口
基于事件流的链式调用
Rxjava原理基于一种扩展的观察者模式
1. 创建被观察者 & 生产事件
2. 通过通过订阅(subscribe)连接观察者和被观察者
3. 创建观察者 & 定义响应事件的行为
Carson带你学Android:手把手带你入门神秘的Rxjava_Carson带你学Android的博客-CSDN博客
RxAndroid
RxAndroid开发讲解第五集_哔哩哔哩_bilibili
RxAndroid是RxJava针对Android平台做了一些调整。可以理解为RxAndroid是专供 android的RxJava,两者差不多。
基本使用:
1、定义Observable(被观察者)(Rx包里的),创建是需指定Observable的泛型类型,作为响应式传参类型,在observable的subscribe方法中定义异步操作,然后调用ObservableEmitter的onNext(传响应数据时调用)、onError(有异常时调用)、onComplete(完成时调用)方法。
2、定义Observer(观察者)(Rx包里的),observer里有三个方法onNext、onError、onComplete
3、调用observable.subscribe(observer)
.observeOn(AndroidSchedulers.mainThread())//指定观察者在哪运行,这里指在主线程 .subscribeOn(Schedulers.io())//指定被观察者在哪运行,这里指在子线程执行
创建型操作符:即创建被观察者对象,并发送事件。
create():最基本的创建被观察者的方法
just() 将传入的数据一次发射出去(最多10个)
fromIterable(): 将传入的一组数据按角标一次发射出去,即发射一组数据。
fromArray(): 对一组数据进行观察,即把一组数据一次性发射被观察者(因此,观察者的onNext()只执行一次) timer(): 延迟指定时长发射一个类型为long、数值为0的事件(默认在新线程发射)。他有两个重载方法:
interval():按照指定的时间间隔,每次发送一个事件,发送事件的序列为:默认从0开始,无限递增的整数序列(默认在新线程中进行
intervalRange(): 作用和interval一样,但这里可以指定发送数据的个数,而interval是无限发射,除非主动停止。
range(): 发射指定范围的序列:可指定发射范围,作用同 intervalRange 一样,不同的是,range是无延迟发射。
转换型操作符: 变换被观察者发送的事件,将事件按照一定的规则变换,然后将变换后的事件发送出去。
map():将被观察者转换成新的被观察者发射出去,观察者收到的是新的被观察者发射出的事件。
flatMap():使用一个指定的函数对原始Observable发射的每一项数据执行变换操作,这个函数返回一个本身也发射数据的Observable,然后FlatMap合并这些Observables发射的数据,最后将合并后的结果当做它自己的数据序列发射。
concatMap(): 基本与 flatMap()类似,只是他可以保证观察者收到的和被观察者发射时的顺序。
buffer():将要发射的数据按照一定的间隔分成若干段,然后把分成的每一段作为一个新的被观察者发射出去,即简单理解为分组发射。他有多个重载方法:
合并型操作符:即组合多个被观察者发送的事件并发送。
功能型操作符:辅助被观察者发哦少年宫事件时实现一定的功能需要,如错误处理、线程调度等。
过滤型操作符: 用于对被观察者发出的事件进行过滤和选择,从而让被观察者返回我们需要的数据。
条件型操作符: 类似过滤型操作符,给被观察者发送的事件加上一定,而让被观察者返回我们需要的数据。
RxBus
基于Rxjava
AsyncTask
原理:基于Handler机制