点我啊,代码在这里
在代码代码中,我们经常碰到异步方法嵌套。比如提交文件之后在提交表,单提交数据根据是否成功然后做出其他逻辑处理.kotlin里面提出协程概念,利用语法糖来解决这个问题。在javaScript里面也有异步/等待来使异步用起来像同步。而在java中我暂时没有找到该特性,使得写起来异步嵌套感觉就是地狱,像吃了屎一样。利用这春节几天时间,尝试着按自己思路去解决这个问题,造个流式的轮子,于是写了流小框子。
从生活中思考代码,方法嵌套和水流的原理很相似,我们把每个异步当成一个水管,水从一个个管道流过,每个管道可以对水进行加工转换。转换的这个过程我们当成一个事件事件。在包装事件中,我们可以对它进行线程转换,事件转换,合并拆分等一系列转换。如果碰到异常,则直接终止这个流。
<强>简单使用强>
通过流静态创建方法创建一个流,然后串联下个流,如果不需要返回空白泛型.Event有两个泛型p, R,第一个是前个流流的返回值类型,第二个是当前流流返回类型.await exec方法是结束当前事件流,并将结果代入下个流。
<>强打印两句话强>
流。新建(Event<无效,Void> () { @Override 公共空运行(流流,避免无效,Await等待){ system . out。println(“这是第一个流”); await.exec(空); } })。(新Event<无效,Void> () { @Override 公共空运行(流流,避免无效,Await 等待){ system . out。println(“这是两个流”); await.exec(空); } }) .start (); >之前 λ简化之后
Flow.create ((NoneEvent)(流,等待)→{ system . out。println(“这是第一个流”); await.exec (); })((NoneEvent)(流,等待)→{ system . out。println(“这是两个流”); await.exec (); }) .start (); >之前两数相加
Flow.create ((FirstEvent)(流,整数,等待)→ 等待。exec(整数+ 5)) .resultThen((流,结果)→ system . out。println(“总”+结果)) .start (); >之前 resultThen方法返回是当前流的结果,每个流后面使用resultThen都可以获取流的结果。如果遇到异常,可以通过流throwException方法抛出,可以在流后面catchThen立刻处理,也可以在最后流catchThen处理.finallyThen是事件流结束一个通知。
Flow.create ((FirstEvent)(流、perVal等待)→{ 如果(perVal==0) { 流。throwException(“股息不能为0 !”); 其他}{ await.exec (perVal/5); } }) .resultThen((流,结果)→ system . out。println(“总”+结果)) .catchThen((流,e)→ System.out.println (e.getMessage ())) .finallyThen((流,等待)→ system . out。println(“这是流结束”)).start (); <>强切换线程强>
使用流 Flow.create ((FirstEvent
)(流、perVal等待)→{ 如果(perVal==0) { 流。throwException(“股息不能为0 !”); 其他}{ await.exec (perVal/5); } }) 内(AndroidMain.get ()) .resultThen((流,结果)→ system . out。println(“总”+结果)) 内(AndroidMain.get ()) .catchThen((流,e)→ System.out.println (e.getMessage ())) 内(SingleThread.get ()) .finallyThen((流,等待)→ system . out。println(“这是流结束”)).start (); >之前 收集结果转换成多个流
Flow.each ((FirstEvent,列表=new ArrayList<的在(); list.add (" 1 "); list.add (“2”); list.add (“3”); await.exec(列表); })((LastEvent
之前 多个流结果转换成一个流
如何造个android流流式响应的轮子