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

練習MVP架構開發的App,算是對本身學過的知識作一個總結,作了有一段時間,界面還算挺多的,代碼量仍是有的,裏面作了大量封裝,總體代碼整理得很乾淨,這個我已經盡力整理了。不論是文件(Java、xml、資源文件)命名,仍是佈局設計儘可能簡單簡潔。代碼不會寫的很複雜,整個代碼結構有很高的統一度,結構也比較簡單清晰,方便理解。裏面作了大量的封裝,包括基類的構建和工具類的封裝,再配合Dagger2的使用能夠極大地減輕V層(Activity和Fragment)的代碼,若是你有看源碼的話你會發現大部分V層有效代碼不怎麼會超出100行(不含import語句)。基本上每一個界面都會特地去使用一些知識,因此裏面有些功能不是必要的而純粹是用了使用某些知識點。java

Screenshot

 

項目結構android

先說一些項目的大致結構,瞭解這個看代碼就更容易,固然了,每一個人寫代碼都有本身的一套風格,不必定別人的就適合你。可是我以爲這個很重要,它至關於整個App的根基。若是這部分不看能夠直接跳過。git

項目目錄結構:github

上面是大致的目錄結構,更細分的結構請看源碼,這裏只說明MVP相關部分。這裏把同一個界面的V層實現和P層實現放在了同一個文件,相關接口也放在一塊兒,若是用的不是基礎接口的話,Google的例子代碼也是放在一塊兒的。這樣作的好處是在看代碼的時候能夠很方便地查閱,你們都知道Java是面向接口編程,而我在代碼中V層持有的是P層的實現接口,具體的P層實現類是經過Dagger注入的,一樣P層持有的是V層的實現接口,具體的V層實現類也是經過Dagger注入的。試想一下,若是V層和P層的實現類分開放,當你按F3跳到的是P層的接口,而後再整個項目裏找相應的實現類,若是項目結構比較亂的話就更麻煩了。我把通用的接口都提取出來放base文件夾裏,這樣適當減小些文件的建立,用MVP架構會比日常多生成不少文件,特別是和Dagger一塊兒使用。數據庫

知識總結

這裏列一下一些我以爲可能比較有參考價值的知識點,算是對一些知識點的使用總結。編程

一、V層基類的構建,包括BaseActivity和BaseFragment,對外提供了相同的接口,這樣不管在寫Activity或Fragment時保持代碼高度一致,同時裏面統一注入了P層的實現和一個網絡加載和異常的控件,其中BaseFragment作了懶加載的處理,只要繼承這個基類就能實現懶加載;json

二、歡迎界面SplashActivity自己沒什麼東西,從別人那裏拷了一個Rxjava實現的倒計時,還有就是倒計時那個按鈕是個自定義控件,這個控件在須要按鈕實現特殊點擊效果的時候挺好用,省去寫Drawable的麻煩;緩存

三、主頁面HomeActivity能夠看下DrawerLayout配合Fragment切換時的處理;微信

四、新聞首頁NewsMainFragment可看下ViewPagerAdapter在作增刪和位置調換時的處理,還有RxBus的使用,須要配合欄目管理界面看;網絡

五、新聞列表NewsListFragment的多種不一樣佈局的處理,頭部添加無限輪播的Banner,列表添加進入動畫效果,列表點擊波紋效果,加載更多、刷新、加載中和網絡異常等等;

六、新聞詳情NewsArticleActivity裏配合ScrollView作的頭部標題動畫效果處理,自定義的ScrollView可實現當文章滾動到底部是可繼續上拉加載下一篇文章,提示對話框的使用,ViewStub的使用,繼承BaseSwipeBackActivity就可實現左滑退出。裏面對富文本的處理用了RichText這個庫,會報內存泄漏須要注意;

七、專題SpecialActivity裏帶頭部的列表實現,還有點擊索引跳轉到列表對應位置,自定義的標籤流佈局控件TagLayout,配合CoordinatorLayout的自定義behavior;

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

九、欄目管理ChannelActivity裏RecyclerView拖拽的處理和兩個列表關聯的處理,RxBus發送事件,數據庫使用;

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

十一、美女圖片BeautyListFragment和福利圖片列表WelfareListFragment裏RecyclerView瀑布流的使用,我之因此寫兩個相同的界面是由於網易圖片接口返回的數據帶有分辨率參數,能夠直接設置圖片縮放比例顯示的大小來實現真正的瀑布流,絕對不會像有的App裏的瀑布流圖片被截斷的狀況。而乾貨網接口返回的圖片數據沒有分辨率這個參數,我經過先計算每一個圖片的分辨率再進行顯示,速度上會比前一個慢點,具體體驗可看App效果;

十二、大圖BigPhotoActivity的圖片全屏顯示,佔用SystemBar和NavigationBar,圖片的收藏,Glide進行圖片下載,處理PhotoView和ViewPager使用時的異常;

1三、視頻播放VideoPlayerActivity裏用IjkPlayer作的視頻播放器,視頻彈幕的處理,視頻下載、收藏和分享;

1四、圖片和視頻收藏相關界面裏startActivityForResult的使用,列表的點擊反饋,列表刪除動畫;

1五、視頻下載相關界面簡易下載庫FileDownloader的封裝使用,下載控制,進度顯示,刪除操做處理;

1六、設置界面關於PreferenceScreen的簡單運用,這東西應該用的很少,用法卻是挺特別的;

1七、每一個界面切換儘可能展現不一樣的進入退出動畫,使用overridePendingTransition()來實現不一樣動畫效果,其實5.0有體驗更好的交互動畫處理接口,不過這裏適配到4.0;

1八、Retrofit配合RxJava的使用,使用OkHttp攔截器功能作緩存處理,Dagger2的使用,RxBus的封裝,在網上看到以爲封裝的挺好的拿過來用,列表庫的封裝;

1九、簡易多任務下載器的封裝,注意裏面用的下載器沒有多線程,也沒有使用Service,以前也有作過多線程下載後面改掉了,網上有比較好的開源項目FileDownloader,感興趣本身看下;

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

第三方庫

列一下用到的第三方庫:

leakcanary:檢測應用內存泄漏問題,這個都知道吧

butterknife:幫助Android控件和回調的進行依賴注入,JakeWharton大神的力做

dagger2:Android和Java依賴注入庫

rxjava:一個實現異步操做的庫,如今很是火

RxAndroid:用於Android的Rxjava綁定庫

RxBinding:配合Rxjava處理控件異步調用

RxLifecycle:防止RxJava中subscription致使內存泄漏

RxPermissions:基於RxJava開發的用於幫助在Android 6.0中處理運行時權限檢測

retrofit:目前最好用的網絡通信庫,應該都用過吧

okhttp:okhttp和retrofit作網絡通信是絕配

greenDAO:ORM數據庫,能配合rxjava使用

logger:Log庫,讓打印的Log變得很是漂亮

glide:Google出品的圖片加載庫,這裏有很是好的指導文檔:https://mrfu.me/2016/02/27/Glide_Getting_Started/

BaseRecyclerViewAdapterHelper:很好用的RecyclerView多功能適配器庫,項目裏我並無直接用這個庫,而是按我本身使用習慣在它較早的代碼上作了些改動

recyclerview-animators:RecyclerView的動畫庫,內置了很是多的動畫效果

CircleImageView:很是經常使用的用來顯示圓形頭像的庫

PhotoView:可根據手勢進行縮放的圖像庫,這個也很常見

AndroidImageSlider:展現頭部Banner的庫,動畫效果不少,不過須要依賴picasso和nineoldandroids這兩個庫

NumberProgressBar:性感的數字進度條

FlycoTabLayout:樣式比TabLayout多樣的Tab庫

FlycoDialog:多功能的Dialog

FlycoLabelView:添加角標的庫

gson:幫助Json和Object轉換,這個也經常使用

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

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

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

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

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

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

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

Tinker:微信Android熱補丁方案,功能強大,和其它熱修補方案對比看這裏wiki

DragSlopLayout:一個輔助開發拖拽功能的庫,這是我爲了作這個App的某些功能封裝的庫- -,如今也有用在工做的項目上

IjkPlayerView:基於ijkplayer開發的播放器,也是爲了作這個App的視頻播放功能封裝的庫- -,裏面加了彈幕功能,感興趣能夠看下

TagLayout:好吧不說了- -,主要是標籤佈局功能,還能夠單獨做爲特殊點擊效果的按鈕,如今工做中須要點擊效果的按鈕我都直接用這個庫來處理了,省的寫Drawable

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

相關文章
相關標籤/搜索