最近辭職了,在找工作這里整理記錄下面試遇到的題目:
2018/5/7
1.Android中跨進程通訊的方式有哪些?
Android中跨進程通訊的方式有網(wǎng)路、文件、廣播、Aidl等;
2.為什么在子線程中創(chuàng)建handler會拋出異常,正常怎么創(chuàng)建子線程Handler?
在子線程中直接創(chuàng)建一個handler的時候會拋出?
?java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
錯誤,這是因為沒有調(diào)用線程Looper.perpare()方法去初始化Looper,所以Looper.myLooper對象是空的,需要調(diào)用perpare方法初始化Looper對象;
正常創(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)單例導致內(nèi)存泄露
????????單例的生命周期和應(yīng)用一樣長,如果一個對象(activity、service等上下文)已經(jīng)沒有用處了,但是單例還持有它的引用,那么在整個應(yīng)用程序的生命周期它都不能正常被回收,從而導致內(nèi)存泄露。
(2)靜態(tài)變量導致內(nèi)存泄露
????????靜態(tài)變量存儲在方法區(qū),它的生命周期從類加載開始,到整個進程結(jié)束。一旦靜態(tài)變量初始化后,它所持有的引用只有等到進程結(jié)束才會釋放。
(3)非靜態(tài)內(nèi)部類導致內(nèi)存泄露
????????非靜態(tài)內(nèi)部類(包括匿名內(nèi)部類)默認就會持有外部類的引用,當非靜態(tài)內(nèi)部類對象的生命周期比外部類對象的生命周期長時,就會導致內(nèi)存泄露。
(4)未取消注冊或回調(diào)導致內(nèi)存泄露
???????? 比如我們在Activity中注冊廣播,如果在Activity銷毀后不取消注冊,那么這個廣播會一直存在系統(tǒng)中,同上面所說的非靜態(tài)內(nèi)部類一樣持有Activity引用,導致內(nèi)存泄露。因此注冊廣播后在Activity銷毀后一定要取消注冊。
(5)Timer和TimerTask導致內(nèi)存泄露
(6)集合中對象未清理造成內(nèi)存泄漏
???????? 這個比較好理解,如果一個對象放入到ArrayList、HashMap等集合中,這個集合就會持有該對象的引用。當我們不再需要這個對象時,也并沒有將它從集合中移除,這樣只要集合還在使用(而此對象已經(jīng)無用了),這個對象就造成了內(nèi)存泄露。并且如果集合被靜態(tài)引用的話,集合里面那些沒有用的對象更會造成內(nèi)存泄露了。所以在使用集合時要及時將不用的對象從集合remove,或者clear集合,以避免內(nèi)存泄漏。
(7)資源未關(guān)閉或釋放導致內(nèi)存泄露
????????在使用IO、File流或者Sqlite、Cursor等資源時要及時關(guān)閉。這些資源在進行讀寫操作時通常都使用了緩沖,如果及時不關(guān)閉,這些緩沖對象就會一直被占用而得不到釋放,以致發(fā)生內(nèi)存泄露。因此我們在不需要使用它們的時候就及時關(guān)閉,以便緩沖能及時得到釋放,從而避免內(nèi)存泄露。
(8)屬性動畫造成內(nèi)存泄露
????????動畫同樣是一個耗時任務(wù),比如在Activity中啟動了屬性動畫(ObjectAnimator),但是在銷毀的時候,沒有調(diào)用cancle方法,雖然我們看不到動畫了,但是這個動畫依然會不斷地播放下去,動畫引用所在的控件,所在的控件引用Activity,這就造成Activity無法正常釋放。因此同樣要在Activity銷毀的時候cancel掉屬性動畫,避免發(fā)生內(nèi)存泄漏。
@Override
protected void onDestroy(){
????super.onDestroy();
????mAnimator.cancel();
}
(9)WebView造成內(nèi)存泄露
????????關(guān)于WebView的內(nèi)存泄露,因為WebView在加載網(wǎng)頁后會長期占用內(nèi)存而不能被釋放,因此我們在Activity銷毀后要調(diào)用它的destory()方法來銷毀它以釋放內(nèi)存。
具體可以查看這里:Android內(nèi)存優(yōu)化——常見內(nèi)存泄露及優(yōu)化方案
4.adapter實現(xiàn)的兩種方法?
? ? ? ? 這個問題看到的時候有點懵,因為平時間使用adapter的時候都是繼承自BaseAdapter實現(xiàn)Adapter,可能他們想問的是這個問題
設(shè)計模式(五)適配器模式Adapter(結(jié)構(gòu)型)因為不知道所以面試一般般了,繼續(xù)努力!