換了家公司上班米愿,忙著公司的項(xiàng)目料仗,好一段時(shí)間沒寫博客了遵岩,今天就來分享Android中Splash界面Rx的一種實(shí)現(xiàn)方式
按著筆者一貫的尿性,Splash界面中沒有網(wǎng)絡(luò)一般是彈個(gè)Toast友好的提示一下眷细,不讓進(jìn)主頁面的拦盹,因?yàn)楣P者以往開發(fā)的App幾乎都是對網(wǎng)絡(luò)依賴性極強(qiáng)的App,現(xiàn)在產(chǎn)品提了一個(gè)新需求:右上角可以選擇跳過網(wǎng)絡(luò)溪椎,并且無網(wǎng)絡(luò)時(shí)也可以進(jìn)入主頁面普舆,這類需求肯定是耳熟能詳了,為了以后項(xiàng)目擴(kuò)大后的可擴(kuò)展性B格校读,這里筆者就用了RxJava來實(shí)現(xiàn)(=?ω?=)
先上一張圖
圖中的實(shí)心區(qū)塊根據(jù)項(xiàng)目需求使用了Observable沼侣,因?yàn)榧虞d配置極有可能是一個(gè) 耗時(shí)操作 ,例如先讀取用戶數(shù)據(jù)歉秫、加載曾經(jīng)緩存的Splash界面圖什么的
SplashLoader實(shí)現(xiàn)
這里就貼上實(shí)現(xiàn)的過程:點(diǎn)我看形象的操作符演示
- 對事件流進(jìn)行 Timestamp 蛾洛,記錄時(shí)間
- 通過 FlatMap 進(jìn)行事件流的變化,然后判斷網(wǎng)絡(luò)情況返回一個(gè)新的事件流
- 本來呢筆者是想把 非必要的網(wǎng)絡(luò)請求 和 必要的網(wǎng)絡(luò)請求 進(jìn)行 Zip 或者 Merge 合并處理,后來發(fā)現(xiàn)由于不需要關(guān)注 非必要的網(wǎng)絡(luò)請求 的請求結(jié)果轧膘,所以就直接將其訂閱了
- 對于 必要的網(wǎng)絡(luò)請求 和 離線配置 需要在執(zhí)行完畢后钞螟,延遲(配置的延遲時(shí)間 - 消費(fèi)的時(shí)間),如果選擇跳過了的話(界面上點(diǎn)擊跳過廣告)谎碍,就略過延遲或者跳出延遲鳞滨,利用 TakeUntil、Delay 操作符和 BehaviorSubject 會發(fā)送離訂閱最近的上一個(gè)值的特性來實(shí)現(xiàn)
- 由于 TakeUntil 中斷會直接發(fā)送一個(gè) onComplete 事件蟆淀,這也是RxLifecycle的核心原理拯啦,所以用來做中斷事件流的處理,當(dāng)然由于我們監(jiān)聽了 onComplete 事件來作為是否加載完Splash界面熔任,所以不能和RxLifecycle配合食用
代碼
工程使用了構(gòu)建者模式褒链,你只需要:
- 寫個(gè)倒計(jì)時(shí)控制UI顯示
- 可選傳入配置的請求(可為空)
- 根據(jù)訂閱跳轉(zhuǎn)界面 or 處理異常
- 界面onDestory回收資源即可
- 必要的網(wǎng)絡(luò)請求 和 離線配置 不能直接一個(gè)發(fā)送onComplete事件,必須要有onNext事件疑苔,不然延遲的轉(zhuǎn)換會被忽略
- 必要的網(wǎng)絡(luò)請求 和 離線配置 不能直接一個(gè)發(fā)送onComplete事件碱蒙,必須要有onNext事件,不然延遲的轉(zhuǎn)換會被忽略
-
必要的網(wǎng)絡(luò)請求 和 離線配置 不能直接一個(gè)發(fā)送onComplete事件夯巷,必須要有onNext事件,不然延遲的轉(zhuǎn)換會被忽略
↑ 重要的話說三次
項(xiàng)目地址:SplashLoader
順便學(xué)習(xí)了一把RxJava的操作符哀墓,感興趣的同學(xué)download下來跑一下就知道了
大哉趁餐,敬虔的奧秘,無人不以為然篮绰!就是 神在肉身顯現(xiàn)后雷,被圣靈稱義,被天使看見吠各,被傳于外邦臀突,被世人信服,被接在榮耀里贾漏。 (提摩太前書 3:16 和合本)