?? 首先作為一名剛畢業(yè)從業(yè)不久的Android寶寶來(lái)說(shuō)这弧,第一次獨(dú)立開(kāi)發(fā)完成后我覺(jué)得很有必要梳理一下娃闲,一方面為了在以后的開(kāi)發(fā)路上如果遇到踩過(guò)的坑有個(gè)地方可以參考。另一方面為了以后矯情懷念的時(shí)候拿出來(lái)看一看匾浪。哈哈~廢話不多說(shuō)皇帮,進(jìn)入正題!
? 這篇文章我總結(jié)了在開(kāi)發(fā)中運(yùn)用到的技術(shù)和設(shè)計(jì)思想蛋辈,并且歸納了在實(shí)際開(kāi)發(fā)中遇到的一些問(wèn)題和解決方法属拾,如果大家有遇到此類問(wèn)題也可作參考,文章有不對(duì)的地方也歡迎大家指正冷溶。謝謝渐白!
一、設(shè)計(jì)模式
? 在本次開(kāi)發(fā)中我結(jié)合了databinding?實(shí)現(xiàn)了M-V-VM的架構(gòu)逞频,如圖:
? 關(guān)于M-V-VM模式纯衍,我目前的理解是:model層更像一個(gè)“倉(cāng)庫(kù)”,它負(fù)責(zé)存放各種數(shù)據(jù)(例如:bean和網(wǎng)絡(luò)請(qǐng)求后獲取到的JSON數(shù)據(jù)等)苗胀,而ViewModel層(業(yè)務(wù)邏輯的處理等)更像是一個(gè)“原材料加工廠”襟诸,它負(fù)責(zé)的是把"倉(cāng)庫(kù)"里面的東西拿出來(lái)經(jīng)過(guò)一定的加工后然后投放給“市場(chǎng)”(View)展示給消費(fèi)者(用戶)瓦堵。反過(guò)來(lái),當(dāng)“市場(chǎng)”(View)有新的需要時(shí)它將會(huì)通知“加工廠”(ViewModel)歌亲,“加工廠”會(huì)去“倉(cāng)庫(kù)”(Model)拿相應(yīng)的數(shù)據(jù)加工后返回給“市場(chǎng)”(View)菇用,這樣就達(dá)到了界面——業(yè)務(wù)——數(shù)據(jù)分離的效果。并且是符合面向?qū)ο蟮?a target="_blank" rel="nofollow">SRP(Single responsibility principle)原則 陷揪。
? 這樣的例子不知道大家能不能明白惋鸥,我當(dāng)時(shí)看了很多關(guān)于設(shè)計(jì)模式的資料,產(chǎn)生了一個(gè)疑惑:“M-V-VM模式雖然讓View和Model層解耦悍缠,互不可知卦绣,但是View和ViewModel不是也耦合了嗎?”帶著這個(gè)疑惑扮休,下面要開(kāi)始介紹databinding啦迎卤,它的出現(xiàn)可以解決我們這個(gè)疑惑,如果沒(méi)了解過(guò)databinding的同學(xué)可以點(diǎn)鏈接去看這篇文章拴鸵,這也是我當(dāng)時(shí)學(xué)習(xí)的文章玷坠,入門不錯(cuò)喲~
二、在項(xiàng)目中使用的技術(shù)
1.databinding
? databinding將界面和ViewModel在不耦合的情況下綁定起來(lái)劲藐,原因是為什么呢八堡?因?yàn)榻缑嬉玫倪^(guò)程是布局文件中進(jìn)行的,并且綁定操作也是發(fā)生在View層聘芜,ViewModel中沒(méi)有關(guān)于View中的任何引用兄渺。那么有的童鞋這時(shí)候就有疑問(wèn)了,沒(méi)有引用,那我從model層拿到數(shù)據(jù)之后如果要?jiǎng)討B(tài)顯示在界面上呢汰现?怎么辦挂谍?例如彈出Toast框,沒(méi)有context的話瞎饲,我怎么彈翱谛稹?我可是上過(guò)小學(xué)的人P嵴健妄田!小編不要騙我好嗎!驮捍!這位同學(xué)問(wèn)得好疟呐,差一點(diǎn)就讓小編我無(wú)言以對(duì)。不過(guò)這時(shí)候我就要引出databinding的另一個(gè)牛逼的屬性啦东且,那就是@BindingAdapter启具,它的作用是什么呢?大家都知道databinding可以使數(shù)據(jù)和視圖進(jìn)行綁定珊泳,當(dāng)數(shù)據(jù)發(fā)生改變時(shí)鲁冯,可以使用notifyPropertyChanged()來(lái)刷新被@Bindable標(biāo)記的變量囤踩。這是databinding的一大功能。但是databingding還有另外一個(gè)很強(qiáng)大的功能就是@BindingAdapter晓褪,它到底強(qiáng)大在哪呢堵漱?請(qǐng)看VCR!涣仿!
@BindingAdapter({"erroInfo"})
public static voidtoastErroInfo(View view,String erroInfo) {
? if(erroInfo !=null) {
?????? CustomToast.makeText(view.getContext(),erroInfo,Toast.LENGTH_SHORT).show();
?? }
}
?? 這是一段我封裝的關(guān)于彈出錯(cuò)誤信息提示的代碼勤庐,如果你看過(guò)我上面介紹的databinding使用文章的話,你應(yīng)該懂得他的意思好港。在我用@BindingAdapter這個(gè)方法后愉镰,我只需要在布局文件控件的屬性里面加上一句:app:erroInfo=“{viewModel.erroInfo}”,這樣我就可以輕易的彈出Toast框而又不會(huì)造成和viewModel耦合的問(wèn)題了钧汹,因?yàn)槲覉?zhí)行的操作都是在共有類里面的一個(gè)公有方法丈探,無(wú)論是哪個(gè)View和ViewModel綁定,只要你在所在布局文件的根目錄下設(shè)置了自定義屬性它把你要Toast的信息傳過(guò)來(lái)拔莱,他就能幫你顯示出來(lái)碗降,就是辣么神奇。
? 上面的例子只是一個(gè)小小的部分塘秦,databinding還支持大量的操作符讼渊,這一類問(wèn)題有一些也可以用操作符就可以解決的。在這里我就不一一舉例了尊剔,大家可以先去看文章爪幻。不懂得地方可以留言我們一起探討一起進(jìn)步~
2.RxJava
? 對(duì)于RxJava想必大家也不陌生吧,從一開(kāi)始只有小眾知道慢慢的到現(xiàn)在的主流须误。如果有不了解的童鞋可以去看這篇文章 挨稿。本人對(duì)RxJava的接觸不太久,很多方面并沒(méi)有深入了解京痢,所以只是表達(dá)一下到目前為止使用過(guò)RxJava的感受:”它的寫法從上到下奶甘,一條鏈?zhǔn)降恼{(diào)用,邏輯清晰历造,可讀性非常強(qiáng)甩十, 并且還可以自由的切換線程】圆”? 在這個(gè)項(xiàng)目中我只是把他運(yùn)用在Model層里面的網(wǎng)絡(luò)請(qǐng)求模塊中侣监,但RxJava的強(qiáng)大遠(yuǎn)不止這些,還有非常多非常多東西得等我們?nèi)W(xué)臣淤,具體也不一一介紹了橄霉,大家可以看看推薦的那篇文章。
3.Retrofit 2.0
? 對(duì)于配合RxJava邑蒋,我相信Retrofit2.0是最好的選擇了姓蜂。推薦大家可以去看這篇文章《Retrofit 2.0:有史以來(lái)最大的改進(jìn)》 按厘,這也是我當(dāng)時(shí)學(xué)習(xí)Retrofit看的一篇文章。
4.Picasso
? 支持二級(jí)緩存钱慢、加載錯(cuò)誤占位圖逮京、支持裁剪等等,僅僅一行代碼就可實(shí)現(xiàn)圖片異步加載束莫。關(guān)于學(xué)習(xí)文章的話網(wǎng)上數(shù)不勝數(shù)懒棉,這里我推薦我自己當(dāng)時(shí)學(xué)習(xí)的一篇《picasso-強(qiáng)大的Android圖片下載緩存庫(kù)》。
5.其他常用的第三方庫(kù)(百度地圖览绿、科大訊飛策严、zxing、百度推送等)
? 這些第三方庫(kù)我就不一一介紹了饿敲,大家可以去相應(yīng)的官方網(wǎng)站觀看官方文檔妻导,非常詳細(xì),沒(méi)有什么難度怀各。
三倔韭、項(xiàng)目中遇上的“坑”
? 做這個(gè)項(xiàng)目的時(shí)候遇上了不少坑,也查閱了很多資料渠啤。最后總結(jié)出下面的一些問(wèn)題及當(dāng)時(shí)的解決辦法狐肢,一方面給我以后開(kāi)發(fā)提供參考添吗,另一方面大家如果也遇上了這類問(wèn)題也可以給大家一些解決思路沥曹。好了,不說(shuō)了碟联,先點(diǎn)菜吧<嗣馈!
(1)百度推送綁定成功但是無(wú)推送(大意篇)
問(wèn)題描述:這個(gè)問(wèn)題說(shuō)起來(lái)有點(diǎn)搞笑鲤孵,當(dāng)時(shí)我們后臺(tái)給出的文檔中壶栋,要求登錄時(shí)要上傳一個(gè)設(shè)備號(hào)的參數(shù),我當(dāng)時(shí)的代碼獲取的是手機(jī)本身的唯一設(shè)備號(hào)而不是百度推送綁定成功后返回的channelId普监,后面發(fā)現(xiàn)百度推送回調(diào)方法onBind()中有一個(gè)channelId的參數(shù)贵试,才猛然發(fā)現(xiàn)原來(lái)是這個(gè)問(wèn)題,后面把這個(gè)參數(shù)傳給后臺(tái)問(wèn)題就解決了凯正,這個(gè)顯然是我大意造成的毙玻,希望大家以此為戒哈哈!
解決辦法:將onBind()方法中的channelId作為參數(shù)上傳給后臺(tái)
(2)RecycleView中item的點(diǎn)擊事件
問(wèn)題描述: 因?yàn)橐郧笆褂玫亩际荓istView廊散,但看了一些RecycleView的介紹桑滩,感覺(jué)它比ListView更方便也更靈活。所以作為一個(gè)有探索精神的Android寶寶允睹,所以我也決定使用一下RecycleView到項(xiàng)目中运准,一開(kāi)始用的很順利幌氮,后面涉及到item點(diǎn)擊事件的時(shí)候,我想當(dāng)然的跟ListView一樣想setOnItemClickListener()把子條目的點(diǎn)擊事件給設(shè)置出來(lái)胁澳,可是找了半天發(fā)現(xiàn)竟然沒(méi)有8没ァ!韭畸!然后上網(wǎng)一查資料發(fā)現(xiàn)這是需要自己定義的慢洋,所以自己動(dòng)手實(shí)現(xiàn)了一次。
解決辦法:首先在adapter中設(shè)置一個(gè)onClickItem接口和一個(gè)setOnclickItem(ItemOnclickListener listener)方法陆盘,然后在ViewHolder中繼承點(diǎn)擊事件監(jiān)聽(tīng)普筹,實(shí)現(xiàn)接口即可。下面我貼出關(guān)鍵代碼:
public interface? MyItemClickListener {
???????? public voidonItemClick(View v, intpostion);
}
//設(shè)置item監(jiān)聽(tīng)
public void?? setOnItemClickListener(MyItemClickListener listener) {
this.mlistener= listener;
}
這段代碼是在adapter中定義的隘马,接下來(lái)貼出內(nèi)部類ViewHolder中的關(guān)鍵代碼:
public void? onClick(View view) {
if(mlistener!=null) {
mlistener.onItemClick(view,getLayoutPosition());
}
}
實(shí)現(xiàn)之后調(diào)用方法的方法為:
adapter.setOnItemClickListener(new MyItemClickListener({
? ? ? ? public void? onItemClick(View v, intpostion) {
?????? ? ? // 想實(shí)現(xiàn)的Item功能
})太防;
(3)關(guān)于PullToRefreshListView中的onRefreshComplete()方法無(wú)效
問(wèn)題描述:因?yàn)槲以谶@個(gè)項(xiàng)目中其他頁(yè)面也用到了onRefreshComplete()方法,但是發(fā)現(xiàn)并沒(méi)有出現(xiàn)這個(gè)問(wèn)題酸员,但是唯獨(dú)其中一個(gè)頁(yè)面使用這個(gè)方法無(wú)效蜒车,后面在我對(duì)比跟其他頁(yè)面的不同之處,找到了一點(diǎn)蛛絲馬跡(柯南背景音樂(lè)響起~):首先因?yàn)檫@個(gè)頁(yè)面的數(shù)據(jù)是已經(jīng)獲取好并且存儲(chǔ)在本地的數(shù)據(jù)幔嗦,之前那些頁(yè)面的數(shù)據(jù)是臨時(shí)從網(wǎng)絡(luò)獲取的酿愧。這樣的話就會(huì)產(chǎn)生一個(gè)問(wèn)題“加載過(guò)快,數(shù)據(jù)來(lái)不及顯示”邀泉。那么怎么辦呢嬉挡?
解決辦法:
? 我們可以延遲一秒左右,在調(diào)用onRefreshComplete()方法汇恤。代碼如下:
mBinding.lvCardDetail.postDelayed(newRunnable() {
@Override
public void run() {
??????? mBinding.lvCardDetail.onRefreshComplete();
}},1000);
注意:要在setAdapter后面執(zhí)行庞钢,不然是無(wú)效的!
(4)app在Android 5.0以下的手機(jī)崩潰
問(wèn)題描述:在項(xiàng)目終于要上線的時(shí)候因谎,進(jìn)入測(cè)試階段基括,發(fā)現(xiàn)app在Android5.0以下手機(jī)運(yùn)行直接崩潰。而且報(bào)的異常也是奇怪(當(dāng)時(shí)報(bào)的是xml解析異常和找不到類的異常)财岔,關(guān)鍵我的那些代碼都好好的呀风皿!在我查閱了很多資料依然沒(méi)有解決問(wèn)題的時(shí)候,萬(wàn)念俱灰下的我最后抱著死馬當(dāng)活馬醫(yī)的心態(tài)點(diǎn)開(kāi)了最后搜索的一篇文章匠璧,最后也就是這篇文章讓我恍然大悟桐款。
解決辦法:
? 因?yàn)槲翼?xiàng)目的總方法數(shù)超過(guò)了65536這個(gè)限制,所以Android 5.0之前的版本使用的Dalvik運(yùn)行時(shí)執(zhí)行應(yīng)用程序代碼患朱。默認(rèn)情況下鲁僚,Dalvik的限制的應(yīng)用程序,每APK一個(gè)classes.dex字節(jié)碼文件。為了解決這個(gè)限制冰沙,可以使用multidexsupportlibrary侨艾,成為您的應(yīng)用程序的主DEX文件的一部分,然后設(shè)法獲得了額外的DEX文件和它們所包含的代碼拓挥。
? 而在Android 5.0以及更高版本使用的是ARTruntime唠梨,可以支持原生從APK文件中加載多個(gè)dex文件。ART進(jìn)行預(yù)編譯的應(yīng)用程序安裝時(shí)它會(huì)掃描類(..N).dex文件侥啤,并通過(guò)Android設(shè)備編譯成一個(gè)單一的.oat文件執(zhí)行当叭,所以可以正常運(yùn)行。
(5)部分新款A(yù)ndroid手機(jī)打開(kāi)地圖崩潰
問(wèn)題描述:測(cè)試時(shí)發(fā)現(xiàn)盖灸,部分新款A(yù)ndroid手機(jī)打開(kāi)地圖直接崩潰蚁鳖,但是大部分手機(jī)正常。這讓我很苦惱赁炎,當(dāng)時(shí)拿著問(wèn)題手機(jī)和正常運(yùn)行手機(jī)對(duì)比后發(fā)現(xiàn)一個(gè)共性醉箕,那就是問(wèn)題手機(jī)都是比較新款的手機(jī)。在網(wǎng)上一查資料發(fā)現(xiàn)徙垫,這是由于新款手機(jī)讀取不到我項(xiàng)目中l(wèi)ib文件夾中的so文件讥裤。原因是:沒(méi)有找到對(duì)應(yīng)的cpu架構(gòu)文件,讀取失敗姻报。
解決辦法:將百度地圖sdk更換為最新版己英,然后在project文件下的lib文件添加:arm64-v8a、x86吴旋、x86_64文件并把百度地圖sdk對(duì)應(yīng)的so文件也放入相應(yīng)的文件夾中损肛。重新運(yùn)行,正常~
(6)Android 6.0及更高版本系統(tǒng)拍照崩潰
問(wèn)題描述:這個(gè)問(wèn)題暴露的比較明顯邮府,Android 6.0以上的機(jī)型均出現(xiàn)此問(wèn)題荧关,查資料后發(fā)現(xiàn):在Android 6.0 以后除了在Manifests上聲明權(quán)限,有部分危險(xiǎn)權(quán)限還需要在代碼中動(dòng)態(tài)添加權(quán)限褂傀。
解決辦法:下面我舉的是關(guān)于動(dòng)態(tài)添加拍照權(quán)限的核心代碼,其它權(quán)限也是大同小異加勤。
<1>調(diào)用拍照前仙辟,檢查權(quán)限
//檢查權(quán)限
if(ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
??????? //如果沒(méi)有授權(quán),則請(qǐng)求授權(quán)
??????? ActivityCompat.requestPermissions(this, newString[]{Manifest.permission.CAMERA},MY_PERMISSIONS_REQUEST_CALL_CAMERA);
}else{
??????? //有授權(quán)鳄梅,直接開(kāi)啟攝像頭
??????? callCamera();
}
<2>在Activity中調(diào)用onRequestPermissionsResult(int requestCode,@NonNullString[] permissions,@NonNullint[] grantResults)方法叠国。
//判斷請(qǐng)求碼
if(requestCode ==MY_PERMISSIONS_REQUEST_CALL_CAMERA) {
??????? //grantResults授權(quán)結(jié)果
??????? if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
??????? //成功,開(kāi)啟攝像頭
???????? callCamera();
}else{
??????? //授權(quán)失敗
??????? Toast.makeText(this,"Permission Denied",Toast.LENGTH_SHORT).show();
}
return;
這是其中的一個(gè)示例代碼戴尸,大家可以去參考這篇文章?粟焊,里面具體的介紹了此類問(wèn)題的解決辦法。
四、總結(jié)
? 這個(gè)項(xiàng)目中项棠,許多的錯(cuò)誤本是可以避免的悲雳,從而造成效率不升反降。下面我將會(huì)列舉在下個(gè)項(xiàng)目中自己要改進(jìn)的點(diǎn)香追,大家也可作參考:
1.布局文件中不要出現(xiàn)中文合瓢,統(tǒng)一放到res/values/strings下管理(重要指數(shù):★★★)
? 其實(shí)為什么要這樣做呢,因?yàn)槿绻笃谌绻膭?dòng)文字說(shuō)明或者復(fù)用文字說(shuō)明可以直接調(diào)用透典,而不用一遍又一遍的寫晴楔。當(dāng)然,一開(kāi)始直接寫在xml布局文件可能覺(jué)得更加方便峭咒∷捌可大家想一想,如果有20條文字說(shuō)明是一樣的并且分布在不同的頁(yè)面凑队,大家一遍又一遍的敲即使不累钙皮,可哪天產(chǎn)品過(guò)來(lái)說(shuō)要全部修改文字說(shuō)明,這時(shí)候是不是要一個(gè)頁(yè)面一個(gè)頁(yè)面的修復(fù)了顽决?(哈哈~這時(shí)候蛋碎了吧短条!知道錯(cuò)了吧?)
2.代碼中如果出現(xiàn)數(shù)字請(qǐng)統(tǒng)一聲明全局變量來(lái)管理才菠。(重要指數(shù):★★★★)
? 大家如果不懂什么意思我貼出代碼來(lái)大家瞬間就明白了:
(1)設(shè)想一下如果我想在一個(gè)集合里面刪除某一下標(biāo)的數(shù)據(jù)茸时,首先我可以這么做:
String[] arr=new String[“a”,“b”,“c”];
List<String> mList=new ArrayList<>();
//將數(shù)組賦值到集合中
for(int i=0;i<arr.length();i++){
??????? mList.add(arr[i]);
}
//點(diǎn)擊按鈕刪除第二個(gè)下標(biāo)
deleteButton.setOnclickListenner(new onClickListenner(){
??????? public void onClick(View v){
? ? ? ? ? ? ? ? mList.remove(1);
???????? }
});
或者我也可以這么做
String[] arr=new String["a","b","c"];
List mList=new ArrayList<>();
int delete_position=1;
//將數(shù)組賦值到集合中
for(int i=0;i<arr.length();i++){
? ? ? ? mList.add(arr[i]);
}
//點(diǎn)擊按鈕刪除第二個(gè)下標(biāo)
deleteButton.setOnclickListenner(new OnclickListenner(){
??????? public void onClick(View v){
???????????????? mList.remove(delete_position);
??????? }
});
可能從上面代碼看大家覺(jué)得兩種其實(shí)差不多,但是如果一個(gè)類里面一旦有很多個(gè)地方都需要?jiǎng)h除這個(gè)下標(biāo)數(shù)據(jù)的時(shí)候赋访,兩種代碼的差別就出來(lái)了可都。第一種方式你需要在每個(gè)地方都修改下標(biāo),如果是你剛開(kāi)發(fā)不久可能還記得哪些地方有牽連蚓耽,一旦久了的話如果有一個(gè)地方忘了修改渠牲,那bug君就要出來(lái)搞事了。第二種方式只需要輕輕松松在定義好的delete_position上修改那就輕松多了步悠!
3.開(kāi)發(fā)前務(wù)必把頁(yè)面邏輯梳理好签杈,畫好完整的流程圖在開(kāi)始開(kāi)發(fā)。(重要指數(shù):★★★★★)
? (開(kāi)發(fā)前務(wù)必把頁(yè)面邏輯梳理好鼎兽,畫好完整的流程圖在開(kāi)始開(kāi)發(fā)答姥!開(kāi)發(fā)前務(wù)必把頁(yè)面邏輯梳理好,畫好完整的流程圖在開(kāi)始開(kāi)發(fā)谚咬!開(kāi)發(fā)前務(wù)必把頁(yè)面邏輯梳理好鹦付,畫好完整的流程圖在開(kāi)始開(kāi)發(fā)!重要的事情說(shuō)三遍T褙浴G贸ぁ@杉蕖)小編深受其害。因?yàn)閯傞_(kāi)始開(kāi)發(fā)祈噪,很多時(shí)候了解業(yè)務(wù)邏輯之后大概梳理一下就開(kāi)始噠~噠~噠~噠~的敲代碼泽铛,可是敲到一半發(fā)現(xiàn)哎喲~不對(duì),有個(gè)地方出現(xiàn)了問(wèn)題钳降,當(dāng)時(shí)沒(méi)考慮到厚宰。然后就開(kāi)始刪代碼,刪到一些地方的時(shí)候又發(fā)現(xiàn)原來(lái)的代碼好像可以遂填,只需要加一點(diǎn)點(diǎn)條件就行了铲觉,然后又開(kāi)始敲~效率就在這里變得越來(lái)越低了!
? 所以這里大家一定要注意吓坚,了解業(yè)務(wù)之后首先在腦子大概的梳理一下然后畫出流程圖撵幽,畫好之后然后開(kāi)始完善流程圖,盡可能的把各種情況想清楚礁击,畫完之后在開(kāi)始開(kāi)發(fā)盐杂,這樣子開(kāi)發(fā)起來(lái)才有方向感,可以避免走很多彎路哆窿!
4.開(kāi)發(fā)前链烈,把整個(gè)app業(yè)務(wù)了解透徹,抽取共性挚躯。然后開(kāi)始開(kāi)發(fā)(重要指數(shù):★★★★★)
?? 這條和上條類似强衡,不過(guò)這條可能是更加宏觀一點(diǎn),貫穿了整個(gè)app码荔。在開(kāi)發(fā)前如果把a(bǔ)pp的業(yè)務(wù)了解透徹漩勤,抽取出共性,建立基類缩搅,開(kāi)發(fā)時(shí)候就可以直接在基類里面拓展越败,這樣可以省去十分多不必要的麻煩和少敲許多冗余的代碼。不過(guò)在前期規(guī)劃上可能要下一番功夫硼瓣,但是為了代碼的簡(jiǎn)潔和優(yōu)雅究飞,何樂(lè)而不為呢?
5.嘗試使用(MVP+Databinding+Dagger2+Retrofit 2.0+RxJava)(重要指數(shù):★★★★)
? 因?yàn)楫?dāng)時(shí)項(xiàng)目比較趕巨双,所以沒(méi)有學(xué)習(xí)Dagger2噪猾,目前正在學(xué)習(xí)并準(zhǔn)備將這套模式運(yùn)用在下個(gè)項(xiàng)目上。這套架構(gòu)也是目前Android的主流筑累,作為一個(gè)有求知精神的寶寶,怎么可能不學(xué)習(xí)呢丝蹭?
6.嘗試使用Kotlin語(yǔ)言開(kāi)發(fā)(重要指數(shù):★★)
? 如果沒(méi)有了解Kotlin語(yǔ)言的朋友可以去看一下這篇文章 慢宗。因?yàn)锳ndroid是基于Java語(yǔ)言開(kāi)發(fā)的,Kotlin這門語(yǔ)言支持一鍵java代碼轉(zhuǎn)換成Kotlin,有Java基礎(chǔ)的朋友上手并不難镜沽。目前本人也準(zhǔn)備上手這門語(yǔ)言并運(yùn)用到下個(gè)項(xiàng)目中敏晤,有興趣的童鞋可以了解了解~
7.擁有一個(gè)機(jī)械鍵盤(重要指數(shù):★★★★★★★★★★)
? 這條其實(shí)是搞笑的~大家可以忽略!缅茉!不過(guò)擁有一個(gè)機(jī)械鍵盤敲代碼還是十分有feel的嘴脾!有條件的童鞋還是可以考慮的哈哈。