不知不覺2018年已經過了大半没卸,來總結一下今年用到的一些好用的框架和第三方庫,包括App架構秒旋、異步通信庫约计、注入注解框架、網絡請求庫迁筛、圖片加載庫煤蚌、動畫庫、數據庫、音頻視頻庫尉桩、平臺分享庫筒占、藍牙庫、權限請求庫等。
需要android開發(fā)視頻資料可以加我微信: 1914532832 ?驗證信息請注明:android開發(fā)
一、App架構
MVP模式:因為 Android 并沒有嚴格的業(yè)務和界面區(qū)分址芯,項目一龐大狮含,就很容易使代碼結構顯得越來越亂。現在 Android 端對 MVP 模式討論越來越熱凄硼,谷歌6.0API以及更多的體現了MVP設計思維,覺得 MVP 是非常適合 Android 上的APP 開發(fā)。但是目前的框架使用起來都太繁瑣良哲,要建立一大堆的文件和類,希望后續(xù)有簡化這些操作的技術出現助隧。
MVVM :這是因為開始官方支持 DataBinding筑凫,把 MVVM 直接帶到 Android 中。數據綁定在 Windows WPF 和 Web (尤其JSP中)已經非常常見并村,它非常高效的開發(fā)效率巍实,讓你只關心你的數據和業(yè)務。這也對 Android 開發(fā)來說哩牍,無疑是一個非常重大的里程碑棚潦,MVVM模式將原來更新UI的操作從activity或fragment中剝離出來,由ViewModel來統(tǒng)一完成UI更新膝昆。
我們的大致流程是這樣的:在activity或fragment中使用Dagger2注入一個專門用于請求數據的類(比如Presenter類)丸边,然后通過Presenter來進行數據請求(有可能是異步的),請求的數據返回后荚孵,再通過activity或fragment中定義的ViewModel來更新UI妹窖,因此在整個過程中,activity和fragment只起到銜接作用收叶,所有工作都分配給別的類做骄呼,所以activity和fragment中代碼很少。
模塊化:模塊化不是什么新鮮東西了判没,但是很多人忽視這個android自帶并且提倡的功能蜓萄。模塊化就是將我們的app按照功能劃分為許多的模塊,方便管理和修改澄峰。android開發(fā)本身提供了項目模塊化的方法绕德,其實創(chuàng)建App工程時,android系統(tǒng)就為我們提供了一個默認的名為app的模塊摊阀。模塊化的好處就是軟件功能清晰耻蛇,單模塊編譯速度快踪蹬,方便修改,并且方便復用臣咖。比如我們將藍牙功能跃捣、分享功能專門弄成一個個模塊。在很多項目中就可以復用這些模塊夺蛇;而且模塊化都是盡量通過接口來訪問模塊疚漆,模塊功能劃分清晰有利于軟件解耦。一個比較好用的第三方模塊化支持庫是阿里的Arouter刁赦,可以很好的解決模塊間的通信問題娶聘。模塊化最大的問題是,如果模塊劃分太細太多甚脉,會影響模塊集成后的編譯速度丸升。
二、異步通信庫
異步操作(多線程切換)很關鍵的一點是程序的簡潔性牺氨,因為在調度過程比較復雜的情況下狡耻,異步代碼經常會既難寫也難被讀懂。 Android 創(chuàng)造的AsyncTask和Handler猴凹,其實都是為了讓異步代碼更加簡潔夷狰。RxJava是函數響應式編程,它的優(yōu)勢也是簡潔郊霎,但它的簡潔的與眾不同之處在于沼头,隨著程序邏輯變得越來越復雜,它依然能夠保持簡潔书劝。
比如下面這個異步操作进倍,按照傳統(tǒng)的異步處理方式,代碼有一堆的縮進庄撮,不易讀:
new Thread() {
? ? ? ?@Override
? ? ? ?public void run() {
? ? ? ? ? ? super.run();
? ? ? ? ? ? for (File folder : folders) {
? ? ? ? ? ? ? ? ? File[] files = folder.listFiles();
? ? ? ? ? ? ? ? ? for (File file : files) {
? ? ? ? ? ? ? ? ? ? ? ?if (file.getName().endsWith(".png")) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?final Bitmap bitmap = getBitmapFromFile(file);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?getActivity().runOnUiThread(new Runnable() {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@Override
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?public void run() {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?imageCollectorView.addImage(bitmap);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?});
? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ?}
}.start();
但是如果使用如下·Rxjava方式寫,就簡潔易懂多了:
Observable.from(folders)
? ? ? ? .flatMap((Func1) (folder) -> { Observable.from(file.listFiles()) })
? ? ? ? .filter((Func1) (file) -> { file.getName().endsWith(".png") })
? ? ? ? .map((Func1) (file) -> { getBitmapFromFile(file) })
? ? ? ? .subscribeOn(Schedulers.io())
? ? ? ? .observeOn(AndroidSchedulers.mainThread())
? ? ? ? .subscribe((Action1) (bitmap) -> { imageCollectorView.addImage(bitmap) });
現在很多其它的庫都有Rxjava擴展毙籽,使整個app業(yè)務流程都可以用Rxjava串起來洞斯,因此,Rxjava是本人強烈推薦的一個庫坑赡。在導入這些庫時要注意Rxjava包重復導入或者版本問題烙如。Rxjava目前已經發(fā)展到2.0,語法有些變化毅否,但是基本思想還是一樣的亚铁。由Rxjava延伸出來的庫還有:
RxAndroid,函數響應式編程螟加, 把 RxJava 帶到 Android 環(huán)境中徘溢。很多時候吞琐,編寫 Android 程序,你也可以看成是數據的處理和流動然爆,換一種思想編程站粟,曾經看起來很棘手的問題,瞬間就很優(yōu)雅的解決了曾雕,相信你會被這種build模式的開發(fā)會越來越愛奴烙。
RxBinding,是 Jake Wharton 的一個開源庫剖张,它提供了一套在 Android 平臺上的基于 RxJava的 Binding API切诀。所謂 Binding,就是類似設置 OnClickListener 搔弄、設置 TextWatcher 這樣的注冊綁定對象的 API幅虑。例如,下面這個按鈕Button防抖處理(避免按鈕重復點擊問題):
button = (Button) findViewById( R.id.bt ) ;
RxView.clicks( button )
? ? ? ? .throttleFirst( 2 , TimeUnit.SECONDS ) //兩秒鐘之內只取一個點擊事件
? ? ? ? .subscribe(new Action1<Void>() {
? ? ? ? ? ? ? ? @Override public void call(Void aVoid) {
? ? ? ? ? ? ? ? ? ? ? ? Toast.makeText(MainActivity.this, "點擊了", Toast.LENGTH_SHORT).show();
? ? ? ? ? ? ? ? }
? ? ? ? }) ;
有了Rxjava肯污,先前流行的發(fā)布翘单、訂閱的輕量級事件總線框架EventBus可以用Rxjava來替代。
另外蹦渣,很多第三方庫也有對應的Rxjava擴展哄芜,所以現在可以說Rxjava在android中已經無孔不入了。因為好用柬唯,就連iOS也有人專門開發(fā)了對應的Rxswift认臊。
三、注入注解框架
Dagger2:android提供的一個注入注解框架锄奢,與Spring 的IOC差不多吧失晴。這個框架它的好處是它沒有采用反射技術(Spring是用反射的),而是用預編譯技術拘央。Dagger2功能是很強大的涂屁,但是Dagger2使用起來還是不太容易理解。
四灰伟、網絡請求庫
okhttp拆又,在Android開發(fā)中,它已經成為眼下最火的http請求框架了栏账。
Retrofit帖族,與okhttp共同出自于Square公司,retrofit就是對okhttp做了一層封裝挡爵。把網絡請求都交給給了Okhttp竖般,我們只需要通過簡單的配置就能使用Retrofit來進行網絡請求了,并且Retrofit支持Rxjava擴展茶鹃,可以將網絡請求整合到Rxjava業(yè)務流中涣雕。
五艰亮、圖片加載庫
早先時候在圖片加載方面,我們大量使用Picasso這個庫胞谭,它是Square的開源項目垃杖,在圖片下載、緩存丈屹、管理等方面提供了極大的方便调俘。但是后來發(fā)現在大量本地圖片加載方面會出現加載失敗問題,再加上Picasso庫已經很長時間沒有更新旺垒,于是改用另一個流行庫Glide彩库,Glide是google員工在Picasso基礎上進行優(yōu)化,總體比Picasso更優(yōu)秀先蒋,在Google很多項目在用骇钦。
六、SQLite數據庫
DBFlow:一個簡化SQLite數據庫使用的第三方庫竞漾,有專門的Rxjava擴展庫眯搭,可以配合Rxjava使用。
LitePal:一個Android庫业岁,使得開發(fā)人員使用SQLite數據庫非常容易鳞仙。
七、動畫庫
?viewanimator:android本身提供了AnimatorSet這個類來支持幾個連續(xù)或同時的動畫笔时,比如一個視圖從(0棍好,0)這個位置移動到(100,100)允耿,同時視圖順時針旋轉90度借笙。但是如果動畫連續(xù)效果很多,代碼量就會增加较锡,顯得代碼很凌亂业稼,代碼不易讀。viewanimator代碼類似Rxjava的鏈式結構蚂蕴,動畫過程一目了然低散,碰到頁面里有多個視圖需要動畫并且有一系列連續(xù)動畫時可以使用這個庫。使用很簡單只要在build.gradle里面導入:implementation 'com.github.florent37:viewanimator:1.0.5'(最后面的版本號有可能會更新)掂墓。
Lottie:你如果是程序員谦纱,我相信你一定會愛死這個庫看成。這個庫充分體現了一句話:每個人都做自己擅長的事君编。或許這是趨勢吧川慌,未來如果都往這個方向發(fā)展吃嘿,程序員就可以將更多的精力關注在業(yè)務邏輯方面祠乃,而不是成天被UI這些東西搞得死去活來。按照傳統(tǒng)的方法兑燥,一個動畫效果亮瓷,程序員從接到手到開發(fā)結束,往往都要被設計師扒一層皮降瞳,因為動畫的過程需要程序員用代碼來實現嘱支,動畫效果往往很難一次性達到設計師的要求,所以調整挣饥、調整......永無止境的調整除师。有了Lottie這個庫之后,動畫效果是由設計師自己決定的扔枫,設計師使用AE等軟件生成包含一套動畫效果的.json文件汛聚,程序員只是將這個文件加載到app里面,用Lottie庫提供的一個視圖裝一下短荐,而且android和iOS可以共用一套動畫效果(效果好不好倚舀,跟程序員一毛錢關系都沒有,一定有程序員在偷笑)忍宋。至于這個庫的使用方法網上很多痕貌,自己搜索一下。
八讶踪、權限請求庫
EasyPermission:一個簡化Android 6.0項目用戶權限設置的庫芯侥,使用很簡單。
RxPermissions:一個關于用戶權限設置的庫乳讥,該庫在項目運行時動態(tài)進行權限請求柱查,支持RxJava2。
需要android開發(fā)視頻資料可以加我微信: 1914532832 ?驗證信息請注明:android開發(fā)