MVP+Dagger2+Rxjava+Retrofit+GreenDao 小應(yīng)用,包含新聞、圖片、視頻3個(gè)大模塊,代碼整潔干練

練習(xí)MVP架構(gòu)開(kāi)發(fā)的App,算是對(duì)自己學(xué)過(guò)的知識(shí)做一個(gè)總結(jié),做了有一段時(shí)間,界面還算挺多的,代碼量還是有的,里面做了大量封裝,整體代碼整理得很干凈,這個(gè)我已經(jīng)盡力整理了。不管是文件(Java、xml、資源文件)命名,還是布局設(shè)計(jì)盡量簡(jiǎn)單簡(jiǎn)潔。代碼不會(huì)寫(xiě)的很復(fù)雜,整個(gè)代碼結(jié)構(gòu)有很高的統(tǒng)一度,結(jié)構(gòu)也比較簡(jiǎn)單清晰,方便理解。里面做了大量的封裝,包括基類(lèi)的構(gòu)建和工具類(lèi)的封裝,再配合Dagger2的使用可以極大地減輕V層(Activity和Fragment)的代碼,如果你有看源碼的話你會(huì)發(fā)現(xiàn)大部分V層有效代碼不怎么會(huì)超出100行(不含import語(yǔ)句)?;旧厦總€(gè)界面都會(huì)特意去使用一些知識(shí),所以里面有些功能不是必要的而純粹是用了使用某些知識(shí)點(diǎn)。

CSDN:http://blog.csdn.net/github_35180164/article/details/54916134

項(xiàng)目地址:https://github.com/Rukey7/MvpApp

Screenshot



主頁(yè)
圖片動(dòng)圖
下載管理

項(xiàng)目結(jié)構(gòu)

先說(shuō)一些項(xiàng)目的大體結(jié)構(gòu),了解這個(gè)看代碼就更容易,當(dāng)然了,每個(gè)人寫(xiě)代碼都有自己的一套風(fēng)格,不一定別人的就適合你。但是我覺(jué)得這個(gè)很重要,它相當(dāng)于整個(gè)App的根基。如果這部分不看可以直接跳過(guò)。

項(xiàng)目目錄結(jié)構(gòu):

項(xiàng)目結(jié)構(gòu)

上面是大體的目錄結(jié)構(gòu),更細(xì)分的結(jié)構(gòu)請(qǐng)看源碼,這里只說(shuō)明MVP相關(guān)部分。這里把同一個(gè)界面的V層實(shí)現(xiàn)和P層實(shí)現(xiàn)放在了同一個(gè)文件,相關(guān)接口也放在一起,如果用的不是基礎(chǔ)接口的話,Google的例子代碼也是放在一起的。這樣做的好處是在看代碼的時(shí)候可以很方便地查閱,大家都知道Java是面向接口編程,而我在代碼中V層持有的是P層的實(shí)現(xiàn)接口,具體的P層實(shí)現(xiàn)類(lèi)是通過(guò)Dagger注入的,同樣P層持有的是V層的實(shí)現(xiàn)接口,具體的V層實(shí)現(xiàn)類(lèi)也是通過(guò)Dagger注入的。試想一下,如果V層和P層的實(shí)現(xiàn)類(lèi)分開(kāi)放,當(dāng)你按F3跳到的是P層的接口,然后再整個(gè)項(xiàng)目里找相應(yīng)的實(shí)現(xiàn)類(lèi),如果項(xiàng)目結(jié)構(gòu)比較亂的話就更麻煩了。我把通用的接口都提取出來(lái)放base文件夾里,這樣適當(dāng)減少些文件的創(chuàng)建,用MVP架構(gòu)會(huì)比平常多生成很多文件,特別是和Dagger一起使用。

知識(shí)總結(jié)

這里列一下一些我覺(jué)得可能比較有參考價(jià)值的知識(shí)點(diǎn),算是對(duì)一些知識(shí)點(diǎn)的使用總結(jié)。

1、V層基類(lèi)的構(gòu)建,包括BaseActivity和BaseFragment,對(duì)外提供了相同的接口,這樣無(wú)論在寫(xiě)Activity或Fragment時(shí)保持代碼高度一致,同時(shí)里面統(tǒng)一注入了P層的實(shí)現(xiàn)和一個(gè)網(wǎng)絡(luò)加載和異常的控件,其中BaseFragment做了懶加載的處理,只要繼承這個(gè)基類(lèi)就能實(shí)現(xiàn)懶加載;

2、歡迎界面SplashActivity本身沒(méi)什么東西,從別人那里拷了一個(gè)Rxjava實(shí)現(xiàn)的倒計(jì)時(shí),還有就是倒計(jì)時(shí)那個(gè)按鈕是個(gè)自定義控件,這個(gè)控件在需要按鈕實(shí)現(xiàn)特殊點(diǎn)擊效果的時(shí)候挺好用,省去寫(xiě)Drawable的麻煩;

3、主頁(yè)面HomeActivity可以看下DrawerLayout配合Fragment切換時(shí)的處理;

4、新聞首頁(yè)NewsMainFragment可看下ViewPagerAdapter在做增刪和位置調(diào)換時(shí)的處理,還有RxBus的使用,需要配合欄目管理界面看;

5、新聞列表NewsListFragment的多種不同布局的處理,頭部添加無(wú)限輪播的Banner,列表添加進(jìn)入動(dòng)畫(huà)效果,列表點(diǎn)擊波紋效果,加載更多、刷新、加載中和網(wǎng)絡(luò)異常等等;

6、新聞詳情NewsArticleActivity里配合ScrollView做的頭部標(biāo)題動(dòng)畫(huà)效果處理,自定義的ScrollView可實(shí)現(xiàn)當(dāng)文章滾動(dòng)到底部是可繼續(xù)上拉加載下一篇文章,提示對(duì)話框的使用,ViewStub的使用,繼承BaseSwipeBackActivity就可實(shí)現(xiàn)左滑退出。里面對(duì)富文本的處理用了RichText這個(gè)庫(kù),會(huì)報(bào)內(nèi)存泄漏需要注意;

7、專題SpecialActivity里帶頭部的列表實(shí)現(xiàn),還有點(diǎn)擊索引跳轉(zhuǎn)到列表對(duì)應(yīng)位置,自定義的標(biāo)簽流布局控件TagLayout,配合CoordinatorLayout的自定義behavior;

8、圖片新聞PhotoSetActivity中ViewPager在顯示圖片時(shí)的加載中和加載異常的處理,自定義的拖拽布局DragSlopLayout;

9、欄目管理ChannelActivity里RecyclerView拖拽的處理和兩個(gè)列表關(guān)聯(lián)的處理,RxBus發(fā)送事件,數(shù)據(jù)庫(kù)使用;

10、圖片首頁(yè)P(yáng)hotoMainFragment里屬性動(dòng)畫(huà)Keyframe和PropertyValuesHolder的使用;

11、美女圖片BeautyListFragment和福利圖片列表WelfareListFragment里RecyclerView瀑布流的使用,我之所以寫(xiě)兩個(gè)相同的界面是因?yàn)榫W(wǎng)易圖片接口返回的數(shù)據(jù)帶有分辨率參數(shù),可以直接設(shè)置圖片縮放比例顯示的大小來(lái)實(shí)現(xiàn)真正的瀑布流,絕對(duì)不會(huì)像有的App里的瀑布流圖片被截?cái)嗟那闆r。而干貨網(wǎng)接口返回的圖片數(shù)據(jù)沒(méi)有分辨率這個(gè)參數(shù),我通過(guò)先計(jì)算每個(gè)圖片的分辨率再進(jìn)行顯示,速度上會(huì)比前一個(gè)慢點(diǎn),具體體驗(yàn)可看App效果;

12、大圖BigPhotoActivity的圖片全屏顯示,占用SystemBar和NavigationBar,圖片的收藏,Glide進(jìn)行圖片下載,處理PhotoView和ViewPager使用時(shí)的異常;

13、視頻播放VideoPlayerActivity里用IjkPlayer做的視頻播放器,視頻彈幕的處理,視頻下載、收藏和分享;

14、圖片和視頻收藏相關(guān)界面里startActivityForResult的使用,列表的點(diǎn)擊反饋,列表刪除動(dòng)畫(huà);

15、視頻下載相關(guān)界面簡(jiǎn)易下載庫(kù)FileDownloader的封裝使用,下載控制,進(jìn)度顯示,刪除操作處理;

16、設(shè)置界面關(guān)于PreferenceScreen的簡(jiǎn)單運(yùn)用,這東西應(yīng)該用的不多,用法倒是挺特別的;

17、每個(gè)界面切換盡量展示不同的進(jìn)入退出動(dòng)畫(huà),使用overridePendingTransition()來(lái)實(shí)現(xiàn)不同動(dòng)畫(huà)效果,其實(shí)5.0有體驗(yàn)更好的交互動(dòng)畫(huà)處理接口,不過(guò)這里適配到4.0;

18、Retrofit配合RxJava的使用,使用OkHttp攔截器功能做緩存處理,Dagger2的使用,RxBus的封裝,在網(wǎng)上看到覺(jué)得封裝的挺好的拿過(guò)來(lái)用,列表庫(kù)的封裝;

19、簡(jiǎn)易多任務(wù)下載器的封裝,注意里面用的下載器沒(méi)有多線程,也沒(méi)有使用Service,之前也有做過(guò)多線程下載后面改掉了,網(wǎng)上有比較好的開(kāi)源項(xiàng)目FileDownloader,感興趣自己看下;

20、新加入Tinker熱修補(bǔ)架構(gòu),實(shí)際是對(duì)Tinker的例子整理在一個(gè)Module里方便引用,用法相加官方文檔wiki;

第三方庫(kù)

列一下用到的第三方庫(kù):

leakcanary:檢測(cè)應(yīng)用內(nèi)存泄漏問(wèn)題,這個(gè)都知道吧

butterknife:幫助Android控件和回調(diào)的進(jìn)行依賴注入,JakeWharton大神的力作

dagger2:Android和Java依賴注入庫(kù)

rxjava:一個(gè)實(shí)現(xiàn)異步操作的庫(kù),現(xiàn)在非?;?/p>

RxAndroid:用于Android的Rxjava綁定庫(kù)

RxBinding:配合Rxjava處理控件異步調(diào)用

RxLifecycle:防止RxJava中subscription導(dǎo)致內(nèi)存泄漏

RxPermissions:基于RxJava開(kāi)發(fā)的用于幫助在Android 6.0中處理運(yùn)行時(shí)權(quán)限檢測(cè)

retrofit:目前最好用的網(wǎng)絡(luò)通訊庫(kù),應(yīng)該都用過(guò)吧

okhttp:okhttp和retrofit做網(wǎng)絡(luò)通訊是絕配

greenDAO:ORM數(shù)據(jù)庫(kù),能配合rxjava使用

logger:Log庫(kù),讓打印的Log變得非常漂亮

glide:Google出品的圖片加載庫(kù),這里有非常好的指導(dǎo)文檔:https://mrfu.me/2016/02/27/Glide_Getting_Started/

BaseRecyclerViewAdapterHelper:很好用的RecyclerView多功能適配器庫(kù),項(xiàng)目里我并沒(méi)有直接用這個(gè)庫(kù),而是按我自己使用習(xí)慣在它較早的代碼上做了些改動(dòng)

recyclerview-animators:RecyclerView的動(dòng)畫(huà)庫(kù),內(nèi)置了非常多的動(dòng)畫(huà)效果

CircleImageView:非常常用的用來(lái)顯示圓形頭像的庫(kù)

PhotoView:可根據(jù)手勢(shì)進(jìn)行縮放的圖像庫(kù),這個(gè)也很常見(jiàn)

AndroidImageSlider:展示頭部Banner的庫(kù),動(dòng)畫(huà)效果很多,不過(guò)需要依賴picasso和nineoldandroids這兩個(gè)庫(kù)

NumberProgressBar:性感的數(shù)字進(jìn)度條

FlycoTabLayout:樣式比TabLayout多樣的Tab庫(kù)

FlycoDialog:多功能的Dialog

FlycoLabelView:添加角標(biāo)的庫(kù)

gson:幫助Json和Object轉(zhuǎn)換,這個(gè)也常用

fastjson:功能同gson,有些地方gson不能處理可以試試這個(gè),阿里巴巴出品

ijkplayer:B站出品的視頻解碼庫(kù)

DanmakuFlameMaster:同樣B站出品的彈幕庫(kù)

ShineButton:炫酷效果的點(diǎn)擊按鈕,主要用于顯示收藏之類(lèi)的動(dòng)畫(huà)

RichText:富文本的處理庫(kù),用起來(lái)挺方便就是有內(nèi)存泄漏- -

Android-SpinKit:集成多種動(dòng)畫(huà)效果的Drawable,之前有看源碼覺(jué)得代碼封裝得挺好,動(dòng)畫(huà)不僅僅只能用在View上

filepicker:這個(gè)是用來(lái)處理PreferenceScreen的文件選中庫(kù),PreferenceScreen感覺(jué)平時(shí)不怎么看到使用,用法到時(shí)挺特別

Tinker:微信Android熱補(bǔ)丁方案,功能強(qiáng)大,和其它熱修補(bǔ)方案對(duì)比看這里wiki

DragSlopLayout:一個(gè)輔助開(kāi)發(fā)拖拽功能的庫(kù),這是我為了做這個(gè)App的某些功能封裝的庫(kù)- -,現(xiàn)在也有用在工作的項(xiàng)目上

IjkPlayerView:基于ijkplayer開(kāi)發(fā)的播放器,也是為了做這個(gè)App的視頻播放功能封裝的庫(kù)- -,里面加了彈幕功能,感興趣可以看下

TagLayout:好吧不說(shuō)了- -,主要是標(biāo)簽布局功能,還可以單獨(dú)作為特殊點(diǎn)擊效果的按鈕,現(xiàn)在工作中需要點(diǎn)擊效果的按鈕我都直接用這個(gè)庫(kù)來(lái)處理了,省的寫(xiě)Drawable

其它

項(xiàng)目持續(xù)更新,有新想法會(huì)寫(xiě)上去,有問(wèn)題可以發(fā)消息給我,希望能對(duì)你有所幫助。

錯(cuò)誤說(shuō)明

1、很多人反映點(diǎn)擊視頻播放的時(shí)候崩掉了,這里統(tǒng)一說(shuō)明一下,錯(cuò)誤大致這樣:

這是因?yàn)閍ndroid有分不同的CPU架構(gòu),比如armv7a、armv5、X86等等,當(dāng)你使用so庫(kù)的時(shí)候需要根據(jù)機(jī)型來(lái)選擇對(duì)應(yīng)版本,而我在視頻播放那個(gè)庫(kù)里只引用了‘tv.danmaku.ijk.media:ijkplayer-armv7a:0.6.2’ 這個(gè)庫(kù),應(yīng)該大部分機(jī)型是這種架構(gòu),所以有的機(jī)型可能就跑不了,你可以根據(jù)你的機(jī)型來(lái)選擇添加其他的,詳情可以看B站的說(shuō)明ijkplayer,比如:

64位的庫(kù)要求SDK21以上,B站有更新版本,如果要用的時(shí)候記得統(tǒng)一后面的版本號(hào)。

2、還有一個(gè)視頻播放的相關(guān)問(wèn)題,就是如果你要播放其它的視頻格式比如:MKV、AVI、RM等等,直接用也是播不了的,這個(gè)你需要重新編譯ijkplayer去配置支持這些視頻格式,具體編譯方法看ijkplayer的指導(dǎo)說(shuō)明吧,開(kāi)啟多種格式支持的話so就變很大了。如果你懶得編譯的話我之前自己編譯了一個(gè)armv7a的對(duì)應(yīng)so庫(kù),你可以看這里ijkplayer-armv7a。庫(kù)太大了其它版本就沒(méi)傳上去了,有需要在聯(lián)系我吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容