一款基於Kotlin+MVP+元件化的麻雀App(文末有彩蛋)
熱文導讀 | 點選標題閱讀
作者:CysionLiu (原始碼下載地址見文末)
來源:https://java.ctolib.com/article/wiki/105866
為什麼叫麻雀
麻雀雖小,五臟俱全。
其實本app並不叫做麻雀,只是本人認為它比較符合麻雀的特點:小而全。
小,即輕量級,一是指app只專注於實現常見app基礎的邏輯業務功能,並沒有在某個功能點或者UI上做更為細節的實現;二是指app使用了簡潔的的Kotlin語言作為實現語言,使用了相對簡單的一種MVP實現方式,使用了一種比較輕量級的元件化方案。
全,當然是相對的,一是指app的後端也是本人開發,這能讓整個業務邏輯更為全面,也能讓感興趣讀者能更為全面的瞭解此app;二是指app涉及了當前技術趨勢下安卓開發的多個技術點,包括kotlin,mvp,元件化,rxjava,retrofit等;三是指本app實際上可以作為一個快速開發框架,這主要得益於元件化的實現,具體怎麼使用,後續會提到。
此app名字不叫麻雀,而是叫做KtDevBox。
倉庫地址:
App實現:
https://github.com/CysionLiu/KtDevBox
後端實現:
https://github.com/CysionLiu/KtDevBox-backend
掃描二維碼,可下載體驗:
為什麼要寫這個app
誠然,網上關於Kotlin,MVP,元件化的研究、分享已經有很多,但是多數部落格僅僅是泛泛而談,程式碼庫沒有提供不說,部落格中的程式碼甚至都有問題,有些更是抄來抄去。雖然有些好資源的確有挺好的借鑑意義,比如KotlinMvp、Reading等【本文僅著眼於專案級別實現,一些好的library並不在此討論中】,但以下幾點還是讓我覺得有些不足:
這些專案的介面,基本都是爬來的,大多數都是get方式實現,很難形成比較完整的一個功能邏輯,也很難從更全的角度去來展示某些技術點的實現;
Kotlin的使用,Java的味道較重,特別是網路請求的封裝部分;
元件化幾乎沒有涉及,專案是個app,並不能方便的轉為另一專案的實現框架;
文件等介紹略少
KtDevBox當然也存在的一些不足,但該專案的初衷,也僅做學習交流之用,以期對該方面技術的發展,起到一點點幫助。
為什麼用Kotlin
僅說自己體會,至少有這幾個原因吧:
語言切換,對老手真不是問題,況且kotlin與java的相容性很好,所以學習成本不應作為不使用kotlin的理由;
真正擺脫了控制元件從佈局到使用的查詢問題,簡潔明瞭;
函式地位的提升,帶來的程式設計思想的改變,對開發者開發思維是有提升的,當然,程式碼的靈活、更好的擴充套件是可視的效果;
閉包、擴充套件函式、命名引數等語法糖帶來的諸多便利。
為什麼用MVP
有關MVP的討論真是太多了,不過正如本人之前的部落格提到,MVX不管怎麼叫,核心在於分層,至於是C、P或是VM,要看專案自身情況來,甚至可以在同一專案中出現。本專案使用的是MVP的一種簡化些的實現方式,至於好不好用,仁者見仁,這裡只談使用,不談優劣,手動滑稽。再簡略叨叨下MVP的發展吧,以表原因。
MVC中C重,於是功能轉移,出現來了xxModel、xxLogic黨,主要分擔資料獲取的職責;
C和xxModel的強依賴、空指標問題和記憶體洩露問題,促進了Presenter的出現,其主要處理業務邏輯,並繫結View的生命週期,面向介面,更為鬆耦合;此時C轉為P。
完全面向介面之後,難以避免的V和P介面爆炸,也過於分散,出現了Contract,人工約束,首見於github上谷歌的MVP官方示例。
個人認為,M結構相對很穩定,View並無太大必要通過持有P的介面引用去使用P,再者通過Contract的維護並不能真正降低介面太多造成的注意力分散問題。本專案app的MVP實現較為簡單些,也是一種比較常見的方式,具體可閱讀專案程式碼。
為什麼用元件化
元件化是近兩年才較為突出的一種專案管理實現方案,本人認為其符合基本的分而治之的思想,是同MVX一樣,應該出現在任何一個打算長期維護的專案中的技術方案。其實,不僅在安卓端,在ios端、前端(Vue)、後端(Java、Python)都有元件化的使用。至於什麼是元件化,元件化有什麼好處以及如何實現,我想網上有太多優秀部落格和開源庫提及,這裡就不再贅述。
本app雖然小,但也涉及了元件化,選擇的是一種很輕量級、侵入性小的方案--Appjoint,方案雖然輕量級,但是本人認為:元件化思維,入侵性小、能在最初的時候將業務進行元件化管理是元件化的核心,而這個庫很好的符合了要求。
主要功能點
使用者註冊、登入以及資料管理功能;
部落格建立、更新、刪除和檢視等功能;
部落格的收藏、評論、點贊功能;
爬了網易新聞和一些電臺的介面以展示,主要做元件化演示。
專案架構
專案核心架構如圖所示:
專案中的shell只含有MyApplication這一個類檔案,目前app涉及的業務也僅usercenter和media這兩個module,其中usercenter和module並無依賴關係。因此,此專案完全可以作為一個快速開發框架。簡單做法:新建幾個module編寫自身的業務,僅需要被shell依賴,它們並不會受到原業務usercenter和module的影響。然後更改入口Activity之後,就是一個新專案,也不會被打包進apk中。更多元件化的使用可見Appjoint的介紹。
目錄結構
每個元件和一般app的目錄結構基本一致,主要多出了一個package,用來盛放與其它元件通訊用到的類,專案中media元件有例項展示。
router庫的結構如下圖,其中每個元件都單獨擁有一個package,裡面分別盛放元件間通訊的服務介面和共享的資料(元件通訊資料實體類,或者面向json程式設計,手動哈哈,另一個話題)。
主要使用的第三方庫
感謝:
Retrofit
RxJava
glide
statusbarutil
eventbus
appjoint
logger
ultraviewpager
multiple-status-view
SmartRefreshLayout
DToast
MultiWaveHeader
xedittext
Targetfun
本專案僅做學習交流之用。
倉庫地址:
App實現:
https://github.com/CysionLiu/KtDevBox
後端實現:
https://github.com/CysionLiu/KtDevBox-backend
喜歡請記得Star一下。
後續還有更為詳細的專案介紹。
最後,可能有些童鞋還對下面這張圖感興趣。不過,本文只談技術,不談“風月”,微笑。
想進阿里嗎?快加入我們的知識星球吧,如下:
如有收穫,歡迎「分享 」
「點贊」「評論 」
媽媽常教導我,讓我養成良好習慣。這樣長大才能成為一個有用的人。良好的習慣是尊敬師長這樣長大才能成為一個有用的人。良好的習慣是尊敬師長,愛護同學,對人有禮貌;是不粗心,做事情不拖拉;還是愛護公物,不浪費糧食。為什麼呢?因為擁有良好習慣,做一個品德高尚的人,懂得尊重別人,才會得到別人的尊重。我要努力地做到這些。我有一些壞習慣,有時候學習很粗心,把一些會做的題做錯。在生活上,也很粗心,有一次早上起床居然穿反了衣服。我吃飯很慢,有的時候還剩飯。我還起床磨蹭,本來應該迅速地穿好衣服,但是,我總是磨磨蹭蹭地,速度很慢。“我打算在這學期裡,改掉這些壞習慣。早上起來,迅速地穿好衣服,不拖拉。學習不粗心,仔細完成每一道題。吃飯的時候,要很快的把飯吃完,不剩飯。我要從一點一滴做起,逐漸養成良好習慣。我相信自己一定能成為一名品學兼優的好學生!我打算在這學期裡,改掉這些壞習慣。早上起來,迅速地穿好衣服,不拖拉。學習不粗心,仔細完成每一道題。吃飯的時候,要很快的把飯吃完,不剩飯。我要從一點一滴做起,逐漸養成良好習慣。我相信自己一定能成為一名品學兼優的好學生!” 在上幼兒園以前,我什麼也不會幹,就連穿衣服也是媽媽給我穿好,就要上幼兒園了,這樣可不行,媽媽鍛鍊我要學會自己穿衣服。 有一天,媽媽把衣服擺在我面前,開始讓我自己穿。一開始。我又哭又叫就是不穿,還把衣服扔的滿地都是,然後坐在地上開始大哭,等了好長時間,媽媽還是不理我,我只好自己乖乖的把衣服穿好, 一出了房間門,媽媽就笑了起來,再看看我的衣服,毛衣和褲子都穿反了,我趕緊回房間又重新穿了一遍,這次穿好了,拿起外套,可是外套的扣子又扣不上了,釦子可調皮了,好像故意和我作對,我把釦子往釦眼——人類邪惡的根源;愛情——幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話:幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話“親愛的!擦乾你的眼淚,至高無上的愛情已經開啟了我們的眼界,使我們成了它的崇拜者。是它,
媽媽常教導我,讓我養成良好習慣。這樣長大才能成為一個有用的人。良好的習慣是尊敬師長這樣長大才能成為一個有用的人。良好的習慣是尊敬師長,愛護同學,對人有禮貌;是不粗心,做事情不拖拉;還是愛護公物,不浪費糧食。為什麼呢?因為擁有良好習慣,做一個品德高尚的人,懂得尊重別人,才會得到別人的尊重。我要努力地做到這些。我有一些壞習慣,有時候學習很粗心,把一些會做的題做錯。在生活上,也很粗心,有一次早上起床居然穿反了衣服。我吃飯很慢,有的時候還剩飯。我還起床磨蹭,本來應該迅速地穿好衣服,但是,我總是磨磨蹭蹭地,速度很慢。“我打算在這學期裡,改掉這些壞習慣。早上起來,迅速地穿好衣服,不拖拉。學習不粗心,仔細完成每一道題。吃飯的時候,要很快的把飯吃完,不剩飯。我要從一點一滴做起,逐漸養成良好習慣。我相信自己一定能成為一名品學兼優的好學生!我打算在這學期裡,改掉這些壞習慣。早上起來,迅速地穿好衣服,不拖拉。學習不粗心,仔細完成每一道題。吃飯的時候,要很快的把飯吃完,不剩飯。我要從一點一滴做起,逐漸養成良好習慣。我相信自己一定能成為一名品學兼優的好學生!” 在上幼兒園以前,我什麼也不會幹,就連穿衣服也是媽媽給我穿好,就要上幼兒園了,這樣可不行,媽媽鍛鍊我要學會自己穿衣服。 有一天,媽媽把衣服擺在我面前,開始讓我自己穿。一開始。我又哭又叫就是不穿,還把衣服扔的滿地都是,然後坐在地上開始大哭,等了好長時間,媽媽還是不理我,我只好自己乖乖的把衣服穿好, 一出了房間門,媽媽就笑了起來,再看看我的衣服,毛衣和褲子都穿反了,我趕緊回房間又重新穿了一遍,這次穿好了,拿起外套,可是外套的扣子又扣不上了,釦子可調皮了,好像故意和我作對,我把釦子往釦眼——人類邪惡的根源;愛情——幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話:“親愛的!擦乾你的眼淚,至高無上的愛情已經開啟了我們的眼界,使我們成了它的崇拜者。是它,
如你有好的文章想和大家分享歡迎投稿,直接向我投遞文章連結即可
最後,國慶福利來了,我們的知識星球已達到1000人了,之前說過到達1000人時將大大幅漲價到169元,為了反饋大家對我們的關注和厚愛,特此維持現價99元最後一天,今天后(今晚 00:00)後將漲到169元,歡迎大家加入我們的知識星球,更多星球資訊參見:
微信掃描或者點選上方二維碼領取Android\Python\AI\Java等高階進階資源
更多學習資料點選下面的“閱讀原文”獲取
相關文章
- 一款基於Kotlin+MVP+元件化的麻雀AppKotlinMVP元件化APP
- ChatGPT 到底強大在哪裡?(文末有彩蛋)ChatGPT
- 容器技術實踐,這本書幫你“盤”明白!(文末有彩蛋)
- 【文末彩蛋】Adobe國際認證證書查詢
- BtCarousel輪播元件 - 一款易於使用,定製化的輪播元件元件
- 【每週一本書】之《資料驅動:從方法到實踐》(文末有彩蛋)
- 基於ARouter的Android元件化實現Android元件化
- 基於CC的Android MVVM 元件化實現AndroidMVVM元件化
- 基於 MVP 的 Android 元件化開發框架實踐MVPAndroid元件化框架
- 基於Vue元件化的日期聯動選擇器Vue元件化
- 基於CocoaPods的元件化原理及私有庫實踐元件化
- 碎閱:一款基於douban及ONE API開發的資訊類AppAPIAPP
- 基於mpvue的toast元件VueAST元件
- [Android元件化]Android app BundleAndroid元件化APP
- Android 基於註解IOC元件化/模組化的架構實踐Android元件化架構
- 基於Vue的Qabler元件庫Vue元件
- Yoshino: 一個基於React的可定製化的PC元件庫React元件
- 關於模組化、元件化的理解元件化
- 一名一線開發對於App架構和元件化的思考APP架構元件化
- [Android]Gank 元件化例項AppAndroid元件化APP
- 分享一款支援多種簡訊服務商 Hyperf 元件,基於 overtrue/easy-sms 元件改造元件
- 基於vue3的Crontab元件Vue元件
- 基於元件化開發,一個簡單的Android專案框架元件化Android框架
- 醫動力Android基於CC元件化框架的探索與實踐Android元件化框架
- 基於Laravel5.8實現的元件化後臺管理系統Laravel元件化
- 分享一款基於 VUE 的組態工具Vue
- 用Vue實現一款屬於自己的樹形元件Vue元件
- Python 內建介面開發框架 Tkinter入門篇 丙(文末有福利彩蛋,今天可是元宵節)Python框架
- react-router4的按需載入實踐(基於create-react-app和Bundle元件)ReactAPP元件
- Android 架構元件 - 讓天下沒有難做的 AppAndroid架構元件APP
- 基於create-react-app的再配置ReactAPP
- Android基於MediaBroswerService的App實現概述AndroidROSAPP
- 基於CMS的元件複用實踐元件
- 基於 iView 的樹選擇器元件View元件
- 基於小米開源 Soar 的 Hyperf 元件元件
- 基於Vue搭建自己的元件庫(1)Vue元件
- 基於dhtmlxGantt的Blazor甘特圖元件HTMLBlazor元件
- 基於efcore的分表元件開源元件