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

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

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

項目地址:https://github.com/Rukey7/MvpApp

Screenshot



主頁
圖片動圖
下載管理

項目結(jié)構(gòu)

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

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

項目結(jié)構(gòu)

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

知識總結(jié)

這里列一下一些我覺得可能比較有參考價值的知識點,算是對一些知識點的使用總結(jié)。

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

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

3、主頁面HomeActivity可以看下DrawerLayout配合Fragment切換時的處理;

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

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

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

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

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

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

10、圖片首頁PhotoMainFragment里屬性動畫Keyframe和PropertyValuesHolder的使用;

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

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

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

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

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

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

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

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

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

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

第三方庫

列一下用到的第三方庫:

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

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

dagger2:Android和Java依賴注入庫

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

RxAndroid:用于Android的Rxjava綁定庫

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

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

RxPermissions:基于RxJava開發(fā)的用于幫助在Android 6.0中處理運行時權(quán)限檢測

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

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

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

logger:Log庫,讓打印的Log變得非常漂亮

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

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

recyclerview-animators:RecyclerView的動畫庫,內(nèi)置了非常多的動畫效果

CircleImageView:非常常用的用來顯示圓形頭像的庫

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

AndroidImageSlider:展示頭部Banner的庫,動畫效果很多,不過需要依賴picasso和nineoldandroids這兩個庫

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

FlycoTabLayout:樣式比TabLayout多樣的Tab庫

FlycoDialog:多功能的Dialog

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

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

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

ijkplayer:B站出品的視頻解碼庫

DanmakuFlameMaster:同樣B站出品的彈幕庫

ShineButton:炫酷效果的點擊按鈕,主要用于顯示收藏之類的動畫

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

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

filepicker:這個是用來處理PreferenceScreen的文件選中庫,PreferenceScreen感覺平時不怎么看到使用,用法到時挺特別

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

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

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

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

其它

項目持續(xù)更新,有新想法會寫上去,有問題可以發(fā)消息給我,希望能對你有所幫助。

錯誤說明

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

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

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

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

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

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

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