Rxjava源码初理解(一)
最近覺得自己很差,想努個(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
廚師接口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)行做菜了。。
好了從上面看出,大哥叫來(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)題。
- 上一篇: 卡饭PDF转换器
- 下一篇: 安徽省毫州市谷歌卫星地图下载(百度网盘离