媒體數(shù)據(jù)重構(gòu):
現(xiàn)狀:
媒體數(shù)據(jù)就是指手機(jī)里的多媒體數(shù)據(jù),比如圖片,視頻,音樂(lè),在快影這個(gè)項(xiàng)目里使用的地方挺多,比如開(kāi)始編輯前要啟動(dòng)相冊(cè)來(lái)選圖偏 或視頻,編輯封面要選圖片、編輯個(gè)人頭像也要選圖片,本地音樂(lè)里要選音樂(lè),在項(xiàng)目里每個(gè)地方都有自己獨(dú)立的實(shí)現(xiàn),存在重復(fù)在代碼,還有些實(shí)現(xiàn)邏輯有差異,比如有的有響應(yīng)數(shù)據(jù)庫(kù)的變化 有的沒(méi)有,所以針對(duì)這種情況作了重構(gòu),
目的:
1、消除重復(fù)代碼,統(tǒng)一邏輯;
2、對(duì)外提供統(tǒng)一 的調(diào)用接口;
3、接口能夠快速響應(yīng);
具體措施:
1、對(duì)于各種類型的素材 音樂(lè) 視頻? 圖片數(shù)據(jù)獲取邏輯做抽想,抽取共同的邏輯到基類,基類包含的邏輯有 監(jiān)控?cái)?shù)據(jù)庫(kù)變化、更新緩存數(shù)據(jù)、過(guò)濾緩存數(shù)據(jù)(根據(jù)路徑過(guò)濾),具體的素材類 實(shí)現(xiàn)自己的query邏輯;
2、 抽想層次上音樂(lè)? 視頻? 圖片 是一個(gè)抽象層次,和相冊(cè)不在一個(gè)層次上:

3、對(duì)外提供一個(gè) MediaCacheFactory,MediaCacheFactory對(duì)外提供getMediaCache接口,根據(jù)不同的type返回對(duì)應(yīng)的 CacheInstance;
4、在實(shí)現(xiàn)上每種cache對(duì)象都是一個(gè)單例,緩存數(shù)據(jù)保存在內(nèi)存,保證數(shù)據(jù)能夠及時(shí)返回;
5、更新數(shù)據(jù)的時(shí)候,對(duì)于數(shù)據(jù)量達(dá)到一屏的時(shí)候,提前返回部分?jǐn)?shù)據(jù),使頁(yè)面能盡快展現(xiàn);
部分實(shí)現(xiàn):
1、監(jiān)控?cái)?shù)據(jù)庫(kù)的變化,一旦有變化打個(gè)標(biāo)簽,但是不更新數(shù)據(jù),只有下次數(shù)據(jù)流被監(jiān)聽(tīng)的時(shí)候才更新,好處是數(shù)據(jù)并不保持實(shí)時(shí)更新,節(jié)省不必要的性能消耗,一旦被監(jiān)聽(tīng)也能更新到最新的狀態(tài);
2、每種媒體數(shù)據(jù)都是一種數(shù)據(jù)流 Observable<Media>;
3、相冊(cè)類里持有視頻 和 圖片的數(shù)據(jù)流,單獨(dú)監(jiān)聽(tīng)流的變化,再根據(jù)變化獲取最新的數(shù)據(jù)來(lái)合成相冊(cè)數(shù)據(jù);
存在的問(wèn)題:
1、只是對(duì)數(shù)據(jù)做了抽想,沒(méi)有在 Ui層抽像,各處的 Ui 是自己實(shí)現(xiàn)的,在ui上也能抽取通用的代碼,來(lái)封裝成庫(kù)給其他應(yīng)用使用;
2、如果重新做的話? ?考慮viewModel + liveData ,liveData 能夠自動(dòng)管理生命周期,observable 需要自己去 dispose;