> 是否觉得RxJava太难上手呢?不妨使用此库吧,易于理解,易于使用,还能完成RxJava做不到的。这个库的最大好处就是容易理解,并且线程环境易于控制和切换,api也是流式调用类型的。
## 0.如何导入?
[![](https://jitpack.io/v/Ellen2018/EasyChat.svg)](https://jitpack.io/#Ellen2018/EasyChat)
  首先你需要在项目的build.gradle中配置以下代码:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }//加上这句即可
}
}
  然后你在要使用该库的module中添加以下依赖:
implementation 'com.github.Ellen2018:EasyChat:x.y.z'
  x,y,z是笔者库的版本值,例如:1.0.0
## 1.此库的原理
![](https://oscimg.oschina.net/oscnet/up-561b52646e444c676eebab09b712d9220e3.png)
## 2.api说明
  先来说明一下三个角色吧,这三个角色分别为:发送者(Sender),拦截者(Messgener),接收者(Receiver),就像上方原理图一样,Sender(上游)->Messgener(中游,可以有0个,1个或者多个)->Receiver(下游),在整个消息系统中,每一个角色都能决定自己处理消息的线程环境,通过runOn方法来控制,所以能取代RxJava也是必须的,hhhh,先来解释解释Sender,Messgener,Receiver三个类的说明,接着演示一下各种场景下的使用:
### Sender说明
  它的泛型指的是它能发送怎样类型的消息,它直接决定handlerInstruction方法中SenderController能发送怎样类型的消息。
  handlerInstruction方法是Sender专用的处理函数,它的工作环境直接由runOn决定。
  SenderController是Sender用来向下一级发送消息的控制器对象,handlerInstruction方法中以参数的方式传递过去了,通过SenderController我们可以向下一级发送消息(sendMessageToNext方法),错误消息(sendErrMessageToNext方法),完成消息(complete方法)等。
  详细用法看下面代码示例。
### Messgener说明
  使用它需要两个泛型,第一个泛型参数代表接收怎样类型的消息(注意这里的类型指定要与上级保持一致,不然使用的时候会发生ClassCaseException),第二个泛型参数代表它要发送怎样类型的消息,其实说白了就是拦截者能拦截什么类型的消息和发送什么类型的消息。
  详细用法看下面代码示例。
### Receiver说明
  它的泛型指的是它能收到怎样类型的消息(也是与上一级保持一致,不然使用的时候会发生ClassCaseException)。
  详细用法看下面代码示例。
### 关于三者的runOn方法说明
runOn方法中可以传递一个枚举参数,这个枚举的4种类型如下:
/**
* 当前线程模式,与上一级的运行模式保持一致
*/
CURRENT_THREAD,
/**
* 可复用线程模式(使用线程池进行复用)
*/
REUSABLE_THREAD,
/**
* 开启新线程模式
*/
NEW_THREAD,
/**
* 主线程模式(UI线程)
*/
MAIN_THREAD;
  注意当你不调用runOn方法时,它的默认参数是CURRENT_THREAD,也就是和上一级的线程环境保持一致。
### 场景1:如何像RxJava那样请求网络数据?
  代码示例:
//这是笔者请求网络视频数据的一段代码(MVP架构)
new Sender<VideoBean>(){//这里的VideoBean代表当前Sender发送的消息类型为VideoBean
@Override
protected void handlerInstruction(SenderController<VideoBean> senderController) {
String json = null;
try {
//获取网络Json数据
json = mModel.getVideoData();
} catch (IOException e) {
e.printStackTrace();
//发送错误消息到下一级
senderController.sendErrMessageToNext(e);
}
if(json != null){
VideoBean videoBean = new Gson().fromJson(json,VideoBean.class);
//发送消息到下一级
senderController.sendMessageToNext(videoBean);
}
senderController.complete();
}
}
//线程环境设置为可复用线程环境
.runOn(RunMode.REUSABLE_THREAD)
.setReceiver(new Receiver<VideoBean>() {
@Override
protected void handleMessage(VideoBean message) {
//收到上一级的消息,更新UI
mView.refreshVideoSuccess(message);
}
@Override
protected void handleErrMessage(Throwable throwable) {
//收到上一级错误的消息,更新UI
mView.refreshVideoFailure(throwable.getMessage());
}
@Override
protected void complete() {
}
})
//线程环境设置为UI线程
.runOn(RunMode.MAIN_THREAD)
.start();
  以上代码只是一个示范,其实理解起来很简单,首先会调用Sender的handlerInstruction方法,Instruction是指令的意思,就像你给Sender下达一个指令,他就会回调handlerInstruction方法,这个方法调用的线程环境由runOn()方法内传递的参数决定,它的参数是一个枚举,关于这个runOn方法,笔者之后会提到。我们接着来解释以上代码,我们看到代码种handlerInstruction方法种有一个参数SenderController,它是用来干嘛的呢?从名字上就很容易理解,就是发送者控制器,它是用来向下一个级发送消息用的,sendErrMessageToNext是发送错误消息的意思(调用之后下一级的handleErrMessage被调用),sendMessageToNext是发送消息的意思(调用之后下一级的handleMessage被调用),complete是完成的意思(调用之后,下一级的complete方法被调用,拦截者没有complete方法,因为笔者再三思考觉得没必要加,以后有时间还是加上吧),跟RxJava是一摸一样的设计思路。
### 场景2:嵌套请求网络(串行)
  首先,我来解释解释什么是嵌套请求网络,以访有些同学没有遇到这样的需求,有这样一个业务,他需要请求两个接口,只有两个接口全部请求完成了才能更新UI数据,而且第二个接口请求的参数需要第一个接口请求的参数,RxJava似乎做到这点好像不太容易,但是此库就能完全满足这样串行请求的需求,我们接下来就来一个简单的例子,比如我想把一个Byte类型的数据转化为Integer,然后再转化为String类型,正好类似上面那种嵌套网络需求,代码示例如下:
final byte data = 3;
new Sender<Integer>(){
@Override
protected void handlerInstruction(SenderController<Integer> senderController) {
Integer data1 = new Integer(data);
senderController.sendMessageToNext(data1);
}
}
.runOn(RunMode.REUSABLE_THREAD)
.setMessenger(new Messenger<Integer,String>() {
@Override
protected void handleMessage(MessengerSender<String> messengerSender, Integer receiverMessage) {
messengerSender.sendMessageToNext(String.valueOf(receiverMessage));
}
@Override
protected void handleErrMessage(MessengerSender<String> messengerSender, Throwable throwable) {
}
})
.runOn(RunMode.REUSABLE_THREAD)
.setReceiver(new Receiver<String>() {
@Override
protected void handleMessage(String message) {
Log.e("Ellen2018","收到消息:"+message);
}
@Override
protected void handleErrMessage(Throwable throwable) {
}
@Override
protected void complete() {
}
})
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
具体通信流程 1.客户端连接服务端,服务端通过Selector接收到连接请求,将其socketChannel通道保存到通道集合,并触发客户端连接事件 2.客户端发送数据包请求到服务端,服务端将请求的SelectionKey压入“读消息生产者队列”,立即进入下一批Select 3.读消息消费者线程池中派遣一个就绪线程从客户端读取数据包DataPacket,并触发onReaded事件 4.开发人员在onReaded事件编写逻辑代码,并且决定读入的数据包的去向(返回给客户端,还是结束) 5.若在onReaded事件里,开发人员决定数据包要返回到客户端,则将该SelectionKey压入写消息生产者队列 6.写消息消费者线程池中派遣一个就绪线程,将数据包写到客户端,并触发onWrited事件 这就完成了长连接的一次通信,在所有的通信中都是异步的,没有出现阻塞的地方 若要深入了解,请先了解Java NIO技术
资源推荐
资源详情
资源评论
收起资源包目录
封装一套简单易于使用的流式异步通信框架,追求易于理解,方便使用.rar (65个子文件)
封装一套简单易于使用的流式异步通信框架,追求易于理解,方便使用
新建文本文档.txt 19B
EasyChat-master
gradle.properties 728B
gradle
wrapper
gradle-wrapper.jar 53KB
gradle-wrapper.properties 232B
library
src
androidTest
java
com
ellen
library
ExampleInstrumentedTest.java 744B
test
java
com
ellen
library
ExampleUnitTest.java 378B
main
java
com
ellen
library
library
runmode
ThreadRunMode.java 112B
RunMode.java 378B
serial
Receiver.java 4KB
Messenger.java 6KB
commoninterface
receiver
ReceiverController.java 517B
ReceiverHandler.java 496B
sender
SenderHandler.java 249B
SenderController.java 390B
messenger
MessengerHandler.java 633B
MessengerReceiver.java 533B
MessengerSender.java 324B
Sender.java 4KB
parallel
commoninterface
parallelsender
ParallelSenderControl.java 458B
parallelmessgener
ParallelMessgenerSender.java 677B
ParallelMessgengrHandler.java 1KB
ParallelMessgenerReceiver.java 506B
parallelreceiver
ParallelReceiverHandler.java 558B
ParallelReceiverInterface.java 661B
ParallelSender.java 6KB
ParallelMessageManager.java 2KB
ParallelReceiver.java 6KB
ParallelMessgener.java 8KB
res
values
strings.xml 70B
AndroidManifest.xml 104B
proguard-rules.pro 751B
build.gradle 897B
consumer-rules.pro 0B
.gitignore 7B
app
src
androidTest
java
com
ellen
easychat
ExampleInstrumentedTest.java 741B
test
java
com
ellen
easychat
ExampleUnitTest.java 379B
main
java
com
ellen
easychat
MainActivity.java 6KB
res
mipmap-xxhdpi
ic_launcher_round.png 10KB
ic_launcher.png 6KB
mipmap-hdpi
ic_launcher_round.png 5KB
ic_launcher.png 3KB
drawable-v24
ic_launcher_foreground.xml 2KB
mipmap-anydpi-v26
ic_launcher.xml 272B
ic_launcher_round.xml 272B
mipmap-mdpi
ic_launcher_round.png 3KB
ic_launcher.png 2KB
mipmap-xxxhdpi
ic_launcher_round.png 15KB
ic_launcher.png 9KB
mipmap-xhdpi
ic_launcher_round.png 7KB
ic_launcher.png 4KB
values
colors.xml 208B
strings.xml 71B
styles.xml 383B
layout
activity_main.xml 710B
drawable
ic_launcher_background.xml 5KB
AndroidManifest.xml 712B
proguard-rules.pro 751B
build.gradle 1008B
.gitignore 7B
gradlew.bat 2KB
build.gradle 558B
settings.gradle 55B
gradlew 5KB
.gitignore 208B
README.md 12KB
共 65 条
- 1
资源评论
野生的狒狒
- 粉丝: 1642
- 资源: 1667
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功