Android學(xué)習(xí)路上會(huì)遇到的各種瓶頸總結(jié)
前言
對(duì)于大多數(shù)大三學(xué)生來(lái)說(shuō),這個(gè)暑假是人生***一個(gè)暑假。對(duì)于IT專(zhuān)業(yè)的學(xué)生來(lái)說(shuō),開(kāi)學(xué)后就要面對(duì)各大IT企業(yè)的秋招,很多人會(huì)成為從0開(kāi)始的Android實(shí)習(xí)生。在Android初學(xué)之路上,每個(gè)Android實(shí)習(xí)生都會(huì)遇到各式各樣的瓶頸。
克服瓶頸要從克服自己對(duì)一切瓶頸的偏見(jiàn)做起,把逃避瓶頸的行為變成享受瓶頸帶來(lái)的樂(lè)趣的過(guò)程。要知道喜力比國(guó)產(chǎn)啤酒貴好多的一條重要原因就在于喜力的瓶頸:你現(xiàn)在去買(mǎi)一瓶玻璃瓶裝喜力,用手握住瓶頸,大拇指按住那顆星,然后用你最熟悉的動(dòng)作擼瓶頸,你會(huì)喜歡這種手感的。
Android布局和屏幕適配
Android初學(xué)者遇到的***個(gè)瓶頸就是Android 布局的編寫(xiě)。首先Android的layout是用XML寫(xiě)的,而大多數(shù)大學(xué)生在大學(xué)階段學(xué)習(xí)網(wǎng)頁(yè)制作,都是用HTML繪制基本控件,然后用CSS進(jìn)行頁(yè)面美化;而Android卻用XML繪制界面,style也是用XML寫(xiě)。學(xué)習(xí)XML最重要的熟能生巧,多練習(xí)練習(xí)就順手了,另外XML和HTML有很多相似的地方,比如padding與margin的區(qū)別都是一樣的。
此外Android系統(tǒng)碎片化嚴(yán)重,不同型號(hào)的手機(jī)有著不同的屏幕尺寸和不同的分辨率。為了解決這個(gè)問(wèn)題,我們可以把背景貼圖做成.9png格式,并且用內(nèi)容和padding撐起控件。如果需要適配的機(jī)型實(shí)在太極端,我們可以百分比布局解決這個(gè)問(wèn)題——PercentRelativeLayout和PercentFrameLayout等。
不同組件的生命周期
Android初學(xué)者遇到的第二個(gè)瓶頸就是生命周期,Android的生命周期主要有Activity生命周期、Fragment生命周期、Service生命周期三種。學(xué)不好Activity的生命周期,你做不好界面跳轉(zhuǎn)的特效,也做不好系統(tǒng)Activity(相機(jī)等)的回調(diào);學(xué)不好Fragment的生命周期,你寫(xiě)不出惰性加載;學(xué)不好Service的生命周期,你連后臺(tái)運(yùn)行都做不到。學(xué)習(xí)生命周期,要記住“文無(wú)圖時(shí)少直觀,圖無(wú)文時(shí)難入微”,用圖表輔助記憶。
網(wǎng)絡(luò)請(qǐng)求和json解析
Android是移動(dòng)互聯(lián)網(wǎng)的重要組成部分,網(wǎng)絡(luò)請(qǐng)求和Json解析是Android學(xué)習(xí)中的重要環(huán)節(jié),很多初學(xué)者會(huì)在此處遭遇瓶頸。
為了突破這個(gè)瓶頸,初學(xué)者應(yīng)該先選擇合適的框架以盡快解決實(shí)習(xí)工作中的問(wèn)題。常用的網(wǎng)絡(luò)請(qǐng)求框架有Volley和OKHttp等;常見(jiàn)的json解析框架有Gson和Jackson等,如果你的求職目標(biāo)是阿里巴巴集團(tuán),學(xué)習(xí)一下FastJson是可以助你一臂之力的;此外還有把網(wǎng)絡(luò)請(qǐng)求和json解析整合到一起的Retrofit。
實(shí)習(xí)生初入企業(yè),要記住用工作時(shí)間解決工作中的問(wèn)題,知識(shí)的探索和能力的提升要利用自己的業(yè)余時(shí)間。下班后要學(xué)習(xí)以上框架的源碼和實(shí)現(xiàn)原理,比如Android的網(wǎng)絡(luò)請(qǐng)求必須在子線程中進(jìn)行,否則會(huì)造成NetworkOnMainThreadException;現(xiàn)在的網(wǎng)絡(luò)請(qǐng)求都是基于HttpURLConnection的,任何大談HttpClient的資料都是過(guò)時(shí)的;還要弄清楚Handler的原理、ThreadPool的原理、AsyncTask的原理等;json解析方面的知識(shí)還有JSONObject和JSONArray的區(qū)別、Java的泛型機(jī)制、Java的反射機(jī)制等等。
圖片加載和內(nèi)存優(yōu)化
Android機(jī)的價(jià)位一般比iPhone低得多,所以Android系統(tǒng)比iOS系統(tǒng)更容易遇到內(nèi)存溢出問(wèn)題(OutOfMemoryError,簡(jiǎn)稱(chēng):OOM),這也是初學(xué)者常見(jiàn)的學(xué)習(xí)瓶頸之一。OOM最多發(fā)于圖片,其次布局中嵌入的地圖、視頻等吃?xún)?nèi)存大戶(hù)也是OOM的罪魁禍?zhǔn)字弧?/p>
解決加載圖片的OOM應(yīng)該先選擇Picasso、Glide、Fresco等框架以盡快解決工作中的問(wèn)題,然后利用個(gè)人時(shí)間學(xué)習(xí)Android緩存機(jī)制——LruCache和DiskLruCache;地圖、視頻的OOM應(yīng)該在界面被回收時(shí)清除控件、停止服務(wù);其他的OOM應(yīng)該用弱引用和軟引用解決。
RecyclerView
Android最常用也是最復(fù)雜的控件是RecyclerView(2014及以前的資料是ListView),因?yàn)榛瑒?dòng)沖突、列表中數(shù)據(jù)修改等問(wèn)題都會(huì)在RecyclerView中體現(xiàn)。為了克服這些瓶頸,必須要搞清楚RecyclerView.Adapter(也包括以前的BaseAdapter)的工作原理,ViewHolder的工作原理,以及ViewGroup的事件分發(fā)機(jī)制等內(nèi)容,這些內(nèi)容不下大力氣學(xué)習(xí)是不能完全掌握的。
克服了以上瓶頸后,估計(jì)實(shí)習(xí)生也該到了畢業(yè)轉(zhuǎn)正的時(shí)間了,進(jìn)階路上還有新的瓶頸。新瓶頸有新的玩法:這種玩法需要雙手操作,如果用另一只手按住打開(kāi)著的瓶口擼瓶頸,你可以一邊擼一邊使勁搖,玩HIGH的時(shí)候突然松開(kāi)按住瓶口的手。
自定義控件
Android自帶的控件不能滿(mǎn)足太復(fù)雜的界面控件需求,因此繪制自定義控件也是Android工程師的必備技能。繪制自定義控件需要掌握View的幾個(gè)常見(jiàn)方法的重寫(xiě),如onDraw()、onMeasure()、onLayout()等;對(duì)事件分發(fā)機(jī)制的了解也應(yīng)該比RecyclerView更精熟;此外還需要掌握Canvas和Animator的相關(guān)知識(shí),Android的Canvas和HTML5的Canvas有很多相似性,可以以此突破Canvas的學(xué)習(xí)瓶頸。
進(jìn)程間通信
不同App之間以及同一個(gè)App的不同進(jìn)程之間需要多進(jìn)程通信,多進(jìn)程通信在視頻播放等占用大量資源的場(chǎng)合是很有必要的。進(jìn)程間通信的初學(xué)者百度“多進(jìn)程”會(huì)被AIDL繞得云里霧里,其實(shí)你只要試試Messenger框架,一切進(jìn)程間通信的難題都會(huì)迎刃而解。
Android性能全面優(yōu)化和crash分析
Android初學(xué)者會(huì)遇到的***一個(gè)瓶頸是Android性能全面優(yōu)化。前面提到的Android內(nèi)存優(yōu)化是Android性能優(yōu)化中最重要的部分,但也只是一小部分,Android性能優(yōu)化還包括安裝包體量?jī)?yōu)化、GUI繪制優(yōu)化、電量和流量?jī)?yōu)化等。
GUI方面可以利用ViewStub和去掉其他不必要的背景來(lái)避免OverDraw;安裝包體積可以用壓縮圖片、去除重復(fù)且無(wú)用的依賴(lài)等方式進(jìn)行優(yōu)化;電量和流量可以通過(guò)用推送代替輪詢(xún)、用GZIP文件格式下載過(guò)長(zhǎng)的數(shù)據(jù)流等方式進(jìn)行優(yōu)化。
在移動(dòng)應(yīng)用性能方面,崩潰(Crash)帶來(lái)的影響是最為嚴(yán)重的,Crash指App在運(yùn)行過(guò)程中出現(xiàn)大段用戶(hù)正在進(jìn)行的操作的強(qiáng)制關(guān)閉現(xiàn)象。Crash會(huì)造成關(guān)鍵業(yè)務(wù)中斷、產(chǎn)品口碑變差、用戶(hù)流失等問(wèn)題。Crash可以用UncaughtExceptionHandler捕捉,也可以利用UMeng和Bugly等服務(wù)分析,請(qǐng)注意:如果打算跳槽到阿里,就用UMeng,想要跳槽到騰訊,就用Bugly。
突破了上述所有瓶頸以后,Android程序員的技術(shù)水平都可以達(dá)到獨(dú)當(dāng)一面的程度,甩掉了初學(xué)者帽子的程序員會(huì)發(fā)現(xiàn)頭頂不再是瓶頸,而是從技術(shù)到管理的天花板。