最近辭職了,在找工作這里整理記錄下面試遇到的題目:
2018/5/7
1.Android中跨進(jìn)程通訊的方式有哪些?
Android中跨進(jìn)程通訊的方式有網(wǎng)路、文件煌珊、廣播、Aidl等;
2.為什么在子線程中創(chuàng)建handler會(huì)拋出異常泌豆,正常怎么創(chuàng)建子線程Handler定庵?
在子線程中直接創(chuàng)建一個(gè)handler的時(shí)候會(huì)拋出?
?java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
錯(cuò)誤,這是因?yàn)闆](méi)有調(diào)用線程Looper.perpare()方法去初始化Looper踪危,所以Looper.myLooper對(duì)象是空的蔬浙,需要調(diào)用perpare方法初始化Looper對(duì)象;
正常創(chuàng)建可以在主線程創(chuàng)建:
HandlerThread handlerThread = new HandlerThread("handlerThread-name");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper());
子線程中創(chuàng)建Handler:
new Thread(new Runnable() {
????@Override
? ? public void run() {
????????Looper.prepare();
? ? ? ? Handler handler1 =new Handler(Looper.myLooper());
? ? ? ? Looper.loop();
? ? }
}).start();
3.Android中的內(nèi)存泄漏和優(yōu)化陨倡?
(1)單例導(dǎo)致內(nèi)存泄露
????????單例的生命周期和應(yīng)用一樣長(zhǎng)敛滋,如果一個(gè)對(duì)象(activity许布、service等上下文)已經(jīng)沒(méi)有用處了兴革,但是單例還持有它的引用,那么在整個(gè)應(yīng)用程序的生命周期它都不能正常被回收,從而導(dǎo)致內(nèi)存泄露杂曲。
(2)靜態(tài)變量導(dǎo)致內(nèi)存泄露
????????靜態(tài)變量存儲(chǔ)在方法區(qū)庶艾,它的生命周期從類加載開(kāi)始,到整個(gè)進(jìn)程結(jié)束擎勘。一旦靜態(tài)變量初始化后咱揍,它所持有的引用只有等到進(jìn)程結(jié)束才會(huì)釋放。
(3)非靜態(tài)內(nèi)部類導(dǎo)致內(nèi)存泄露
????????非靜態(tài)內(nèi)部類(包括匿名內(nèi)部類)默認(rèn)就會(huì)持有外部類的引用棚饵,當(dāng)非靜態(tài)內(nèi)部類對(duì)象的生命周期比外部類對(duì)象的生命周期長(zhǎng)時(shí)煤裙,就會(huì)導(dǎo)致內(nèi)存泄露。
(4)未取消注冊(cè)或回調(diào)導(dǎo)致內(nèi)存泄露
???????? 比如我們?cè)贏ctivity中注冊(cè)廣播噪漾,如果在Activity銷毀后不取消注冊(cè)硼砰,那么這個(gè)廣播會(huì)一直存在系統(tǒng)中,同上面所說(shuō)的非靜態(tài)內(nèi)部類一樣持有Activity引用欣硼,導(dǎo)致內(nèi)存泄露题翰。因此注冊(cè)廣播后在Activity銷毀后一定要取消注冊(cè)。
(5)Timer和TimerTask導(dǎo)致內(nèi)存泄露
(6)集合中對(duì)象未清理造成內(nèi)存泄漏
???????? 這個(gè)比較好理解诈胜,如果一個(gè)對(duì)象放入到ArrayList豹障、HashMap等集合中,這個(gè)集合就會(huì)持有該對(duì)象的引用焦匈。當(dāng)我們不再需要這個(gè)對(duì)象時(shí)血公,也并沒(méi)有將它從集合中移除,這樣只要集合還在使用(而此對(duì)象已經(jīng)無(wú)用了)缓熟,這個(gè)對(duì)象就造成了內(nèi)存泄露坞笙。并且如果集合被靜態(tài)引用的話,集合里面那些沒(méi)有用的對(duì)象更會(huì)造成內(nèi)存泄露了荚虚。所以在使用集合時(shí)要及時(shí)將不用的對(duì)象從集合remove薛夜,或者clear集合,以避免內(nèi)存泄漏版述。
(7)資源未關(guān)閉或釋放導(dǎo)致內(nèi)存泄露
????????在使用IO梯澜、File流或者Sqlite、Cursor等資源時(shí)要及時(shí)關(guān)閉渴析。這些資源在進(jìn)行讀寫(xiě)操作時(shí)通常都使用了緩沖晚伙,如果及時(shí)不關(guān)閉,這些緩沖對(duì)象就會(huì)一直被占用而得不到釋放俭茧,以致發(fā)生內(nèi)存泄露咆疗。因此我們?cè)诓恍枰褂盟鼈兊臅r(shí)候就及時(shí)關(guān)閉,以便緩沖能及時(shí)得到釋放母债,從而避免內(nèi)存泄露午磁。
(8)屬性動(dòng)畫(huà)造成內(nèi)存泄露
????????動(dòng)畫(huà)同樣是一個(gè)耗時(shí)任務(wù)尝抖,比如在Activity中啟動(dòng)了屬性動(dòng)畫(huà)(ObjectAnimator),但是在銷毀的時(shí)候迅皇,沒(méi)有調(diào)用cancle方法昧辽,雖然我們看不到動(dòng)畫(huà)了,但是這個(gè)動(dòng)畫(huà)依然會(huì)不斷地播放下去登颓,動(dòng)畫(huà)引用所在的控件搅荞,所在的控件引用Activity,這就造成Activity無(wú)法正常釋放框咙。因此同樣要在Activity銷毀的時(shí)候cancel掉屬性動(dòng)畫(huà)咕痛,避免發(fā)生內(nèi)存泄漏。
@Override
protected void onDestroy(){
????super.onDestroy();
????mAnimator.cancel();
}
(9)WebView造成內(nèi)存泄露
????????關(guān)于WebView的內(nèi)存泄露喇嘱,因?yàn)閃ebView在加載網(wǎng)頁(yè)后會(huì)長(zhǎng)期占用內(nèi)存而不能被釋放暇检,因此我們?cè)贏ctivity銷毀后要調(diào)用它的destory()方法來(lái)銷毀它以釋放內(nèi)存。
具體可以查看這里:Android內(nèi)存優(yōu)化——常見(jiàn)內(nèi)存泄露及優(yōu)化方案
4.adapter實(shí)現(xiàn)的兩種方法婉称?
? ? ? ? 這個(gè)問(wèn)題看到的時(shí)候有點(diǎn)懵块仆,因?yàn)槠綍r(shí)間使用adapter的時(shí)候都是繼承自BaseAdapter實(shí)現(xiàn)Adapter,可能他們想問(wèn)的是這個(gè)問(wèn)題
設(shè)計(jì)模式(五)適配器模式Adapter(結(jié)構(gòu)型)因?yàn)椴恢浪悦嬖囈话惆懔送醢担^續(xù)努力悔据!