Android线程间通信篇

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机制

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值