日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Rxjava源码初理解(一)

發(fā)布時(shí)間:2024/3/13 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Rxjava源码初理解(一) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近覺得自己很差,想努個(gè)力,也不知道為啥努力,那就從自己短板入手吧,學(xué)習(xí)下人家源碼,看看人家博客源碼分析,自己寫個(gè)仿品。自己沒(méi)有能力研究源碼,那盡可能的把人家的分析看懂吧。
第一個(gè)想了解的就是Rxjava,因?yàn)榭鄲纉ava各種回調(diào)和匿名類很久了,找個(gè)優(yōu)雅的方法。看看人家是如何實(shí)現(xiàn)的。
簡(jiǎn)單看人家的代碼,仿著寫一個(gè)加強(qiáng)自己的理解。
參看簡(jiǎn)單的先。
參看:http://www.jianshu.com/p/23c38a4ed360
參看: https://blog.csdn.net/mq2553299/article/details/78670164
參看:還有一個(gè)用顧客 廚師來(lái)分析被觀察者和觀察者的文章實(shí)在找不到了,抱歉抱歉。

我沿用顧客 廚師來(lái)理解Observable和Observer,分別叫Customer 和 Chef 當(dāng)然,為了和源碼一致,分別加上兩個(gè)接口ICustomer 和IChef 。源碼中的ObservableCreate 是Observable的子類,是真正執(zhí)行訂閱的類,我們這里等同于一個(gè)Customer代理類CustomerProxy(相當(dāng)于Customer的小弟,大哥點(diǎn)菜,小弟代勞),源碼中的ObservableOnSubscribe相當(dāng)于飯館里的Waiter(這個(gè)是個(gè)接口,和源碼一致),而CreateEmitter我這里想像成點(diǎn)單紙(Waiter用的,并且交給廚師chef)。
好了,有以上關(guān)系以后 大概的樣子就是 Customer點(diǎn)餐order,小弟CustomerProxy代勞,呼叫Waiter,讓他在點(diǎn)單紙上點(diǎn)菜,CustomerProxy監(jiān)控一切(聯(lián)系waiter,建一個(gè)點(diǎn)單紙交給chef,讓chef去做飯),具體怎么做就看chef的了。
仿源碼:
一、接口
顧客接口ICustomer

public interface ICustomer<T>{void order( IChef<? super T> chef); }

廚師接口IChef

public interface IChef<T>{//void onSubscribevoid OnOrdered(IOrderPapers d);//void onNextvoid onOneOrder(T t);void onError( Throwable e);void onComplete();}

點(diǎn)菜單接口IOrderPapers

public interface IOrderPapers<T> {void onOneOrder( T value);void onError(Throwable error);void onComplete(); }

服務(wù)員接口Waiter

public interface IWaiter<T> {void order( IOrderPapers<T> orderPapers) throws Exception; }

二、顧客類

public abstract class Customer<T> implements ICustomer<T> { //在被觀察者 被觀察者訂閱的時(shí)候也就是顧客被廚師觀察的時(shí)候(給廚師下訂單。。)會(huì)執(zhí)行真正的下單orderActual(chef),這是多態(tài)實(shí)際上是小弟代勞的。。@Overridepublic void order( IChef<? super T> chef) {orderActual(chef);}protected abstract void orderActual(IChef<? super T> chef);//大哥點(diǎn)餐 招呼過(guò)來(lái)一個(gè)服務(wù)員,然后出來(lái)個(gè)小弟叫他負(fù)責(zé)和服務(wù)員點(diǎn)餐。public static <T> Customer<T> CallWaiter(IWaiter<T> waiter) {return new CustomerProxy<T>(waiter);}}

小弟類CustomerProxy

ublic class CustomerProxy <T> extends Customer<T>{IWaiter<T> waiter;public CustomerProxy(IWaiter<T> waiter) {this.waiter=waiter;}//這個(gè)是大哥點(diǎn)餐時(shí),真正執(zhí)行的地方。@Overrideprotected void orderActual(IChef<? super T> chef) {//新建了個(gè)點(diǎn)菜單,聯(lián)系了一個(gè)觀察者廚師。IOrderPapers<T> orderPapers = new OrderPapers<T>(chef);//回調(diào)了廚師點(diǎn)餐后的反應(yīng)。。chef.OnOrdered(orderPapers);try {//waiter開始利用菜單點(diǎn)餐。waiter.order(orderPapers);} catch (Throwable ex) {// Exceptions.throwIfFatal(ex);orderPapers.onError(ex);}} }

點(diǎn)菜單類OrderPapers
這里多說(shuō)一句從上面小弟開始點(diǎn)餐開始,小弟利用了服務(wù)員進(jìn)行點(diǎn)餐,waiter.order(orderPapers); 傳入了一個(gè)點(diǎn)菜單,然后在waiter的order里,會(huì)利用orderPapers進(jìn)行點(diǎn)菜操作onOneOrder。那么orderPapers的onOneOrder會(huì)用IOrderPapers orderPapers = new OrderPapers(chef);傳進(jìn)來(lái)的chef進(jìn)行做菜了。。

public class OrderPapers <T> implements IOrderPapers<T>{final IChef<? super T> chef;OrderPapers(IChef<? super T> chef) {this.chef =chef;}@Overridepublic void onOneOrder( T value) {//點(diǎn)菜單會(huì)利用chef做菜。chef.onOneOrder(value);}@Overridepublic void onError( Throwable error) {}@Overridepublic void onComplete() {} }

好了從上面看出,大哥叫來(lái)一個(gè)waiter 和一個(gè)小弟 說(shuō)你們倆把菜定一下把 ,我要吃某個(gè)chef的菜。小弟說(shuō) waiter 你先來(lái)個(gè)點(diǎn)菜單把,點(diǎn)好了以后,點(diǎn)菜單讓廚師做。。。

最后上下main函數(shù)。

public class CWOC {public static void main(String[] args) {//明明是大哥叫的服務(wù)員,CallWaiter以后其實(shí)是小弟出來(lái)了。那么廚師o(wú)rder的被觀察者其實(shí)是小弟。Customer.CallWaiter(new IWaiter<Integer>() {@Overridepublic void order(IOrderPapers<Integer> orderPapers) throws Exception {orderPapers.onOneOrder(5);orderPapers.onOneOrder(6);}}).order(new IChef<Integer>() {@Overridepublic void OnOrdered(IOrderPapers d) {//我被點(diǎn)了System.out.println("我被點(diǎn)了");}@Overridepublic void onOneOrder( Integer o) {System.out.println(o);}@Overridepublic void onError( Throwable e) {}@Overridepublic void onComplete() {}});} }

以上,可能能更好理解被觀察者(顧客)觀察者(廚師)以及其他類的角色。
可能更亂了,不管怎么樣。自己算是懂了。下次改改加工符。

總結(jié)

以上是生活随笔為你收集整理的Rxjava源码初理解(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。