整理下最近Android面試的題目

最近辭職了,在找工作這里整理記錄下面試遇到的題目:

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ù)努力!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • java 接口的意義-百度 規(guī)范、擴展、回調(diào) 抽象類的意義-樂視 為其子類提供一個公共的類型封裝子類中得重復內(nèi)容定...
    交流電1582閱讀 2,387評論 0 11
  • Markdown 語法和 MWeb 寫作使用說明 Markdown 的設(shè)計哲學 Markdown 的目標是實現(xiàn)「易...
    Smallwolf_JS閱讀 456評論 0 1
  • 制造與解釋流行現(xiàn)象的方法論,可結(jié)合《定位》一書理解流行產(chǎn)品的誕生。 流行潮流的誕生并不是不可琢磨的,而是存在某一個...
    Arthurrrrrr閱讀 273評論 0 0
  • 回顧上周我們掌握了用SQL語言創(chuàng)建數(shù)據(jù)庫以及數(shù)據(jù)表的方法,首先我們嘗試創(chuàng)建數(shù)據(jù)庫和表用于今天的學習。 查詢基礎(chǔ) 從...
    陳昱熹閱讀 501評論 0 4
  • 她是漢文帝皇后、漢景帝生母,是歷史上大名鼎鼎的竇太后。很多人對她的傳奇一生已有所了解。但少有人知道的是,她是景帝朝...
    史事拾遺閱讀 1,530評論 1 3

友情鏈接更多精彩內(nèi)容