2017面試題總結(jié)

一、如何避免OOM異常

解決方法:

方法 1: 等比例縮小圖片

方法 2:對圖片采用軟引用,及時地進(jìn)行 recyle()操作

2、界面切換導(dǎo)致 OOM

1)陈哑、看看頁面布局當(dāng)中有沒有大的圖片,比如背景圖之類的

去除 xml 中相關(guān)設(shè)置伸眶,改在程序中設(shè)置背景圖(放在 onCreate()方法中):

在頁面切換時盡可能少地重復(fù)使用一些代碼

3惊窖、查詢數(shù)據(jù)庫沒有關(guān)閉游標(biāo)

4、構(gòu)造 Adapter 時厘贼,沒有使用緩存的 convertView

5界酒、Bitmap 對象不再使用時調(diào)用 recycle()釋放內(nèi)存

二、ANR是什么嘴秸?怎樣避免和解決ANR

1:5 秒毁欣,主要類型按鍵或觸摸事件在特定時間內(nèi)無響應(yīng)

2:10秒,BroadcastReceiver在特定時間內(nèi)無法處理完成

3:20秒岳掐,Service在特定的時間內(nèi)無法處理完成超時:當(dāng)前的事件沒有機(jī)會得到處理凭疮,或者,當(dāng)前的事件正在處理串述,但沒有及時完成UI線程盡量只做跟UI相關(guān)的工作执解,耗時的工作。

查找ANR的方式:

1. 導(dǎo)出/data/data/anr/traces.txt纲酗,找出函數(shù)和調(diào)用過程衰腌,分析代碼

2. 通過性能LOG 人肉查找

三新蟆、android線程間通訊有幾種方式

1.runOnUiThread(Runnable)? ? ? ? ? ? ? 在子線程中直接使用該方法,可以更新UI右蕊。

2.View.postDelay(Runnable , long)/new Handler().postDelayed(Runnable)延遲操作

3.使用Handler

4.使用AsyncTask

四琼稻、android 應(yīng)用對內(nèi)存是如何限制的?我們應(yīng)該如何合理使用內(nèi)存尤泽?

Android 每一個應(yīng)用的堆內(nèi)存大小有限

?通常的情況為 16M-48M

?通過 ActivityManager 的 getMemoryClass()來查詢可用堆內(nèi)存限制

?3.0(HoneyComb)以上的版本可以通過 largeHeap=“true”來申請更多的堆內(nèi)存

1欣簇、注意資源回收规脸,像數(shù)據(jù)庫坯约,輸入輸出流,定位操作這樣的對象莫鸭,要在使用完及時關(guān)閉流闹丐。

2、少使用靜態(tài)變量被因,因?yàn)橄到y(tǒng)將靜態(tài)變量的優(yōu)先級設(shè)定的很高卿拴,會最后回收。所以可能因?yàn)殪o態(tài)變量導(dǎo)致該回收的沒有回收梨与。而回收了不該回收的內(nèi)存堕花。

3、注意大圖片的縮放粥鞋,如果載入的圖片很大缘挽,要先經(jīng)過自己程序的處理,降低分辨率等呻粹。最好設(shè)置多種分辨率格式的圖片壕曼,以減少內(nèi)存消耗。

五等浊、android 屏幕適配

1腮郊、dp能夠讓同一數(shù)值在不同的分辨率展示出大致相同的尺寸大小。

2筹燕、多用match_parent轧飞、多用weight、自定義view解決

六撒踪、handler機(jī)制

andriod提供了Handler 和 Looper 來滿足線程間的通信踪少。Handler先進(jìn)先出原則。Looper類用來管理特定線程內(nèi)對象之間的消息交換(MessageExchange)糠涛。

1)Looper: 一個線程可以產(chǎn)生一個Looper對象援奢,由它來管理此線程里的MessageQueue(消息隊列)。

2)Handler: 你可以構(gòu)造Handler對象來與Looper溝通忍捡,以便push新消息到MessageQueue里;或者接收Looper從Message Queue取出)所送來的消息集漾。

3) Message Queue(消息隊列):用來存放線程放入的消息切黔。

4)線程:UIthread 通常就是main thread,而Android啟動程序時會替它建立一個MessageQueue具篇。

七纬霞、事件分發(fā)

1.如果事件被消費(fèi),就意味著事件信息傳遞終止驱显。

2.如果事件一直沒有被消費(fèi)诗芜,最后會傳給Activity,如果Activity也不需要就被拋棄埃疫。

3.判斷事件是否被消費(fèi)是根據(jù)返回值伏恐,而不是根據(jù)你是否使用了事件。

八栓霜、子線程發(fā)消息到主線程進(jìn)行更新UI翠桦,除了handler和Async Task,還有什么胳蛮?

1.runOnUiThread(Runnable) 在子線程中直接使用該方法销凑,可以更新UI。

2.View.postDelay(Runnable , long)/new Handler().postDelayed(Runnable)延遲操作

九仅炊、子線程中能不能new handler斗幼?為什么?

當(dāng)我們在主線程中創(chuàng)建Handler對象的時候沒有問題抚垄,是因?yàn)橹骶€程會自動調(diào)用Looper.prepare()方法去給當(dāng)前主線程創(chuàng)建并設(shè)置一個Looper對象蜕窿,隨意在Handler構(gòu)造函數(shù)中從當(dāng)前線程的對象身上拿到這個Looper。

但是子線程中并不會自動調(diào)用這個方法督勺,所以要想在子線程中創(chuàng)建Handler對象就必須在創(chuàng)建之前手動調(diào)用Looper.prepare()方法渠羞,否則就會報錯。

十智哀、如何對android應(yīng)用進(jìn)行性能分析次询?

可以直接使用 ddms 中的工具,其實(shí) ddms 工具已經(jīng)非常的強(qiáng)大了瓷叫。ddms 中有 traceview屯吊、heap、allocation tracker 等工具都可以幫助我們分析應(yīng)用的方法執(zhí)行時間效率和內(nèi)存使用情況摹菠。

Traceview 是 Android 平臺特有的數(shù)據(jù)采集和分析工具盒卸。

heap 工具可以幫助我們檢查代碼中是否存在會造成內(nèi)存泄漏的地方。

allocation tracker 是內(nèi)存分配跟蹤工具次氨。

十一蔽介、畫圖簡述 activity的生命周期


十二、在那個階段activity可見,那個階段activity可以交互虹蓄,那個階段activity進(jìn)入前臺犀呼,\

onCreate: 在這里創(chuàng)建界面,做一些數(shù)據(jù) 的初始化工作

onStart: 到這一步變成用戶可見不可交互的

onResume:變成和用戶可交互 的薇组,(在activity 棧系統(tǒng)通過棧的方式管理這些個Activity的最上面外臂,運(yùn)行完彈出棧,則回到上一個Activity)

onPause: 到這一步是可見但不可交互的律胀,系統(tǒng)會停止動畫 等消耗CPU 的事情從上文的描述已經(jīng)知道宋光,應(yīng)該在這里保存你的一些數(shù)據(jù),因?yàn)檫@個時候你的程序的優(yōu)先級降低,有可能被系統(tǒng)收回炭菌。在這里保存的數(shù)據(jù)罪佳,應(yīng)該在

onstop: 變得不可見,被下一個activity覆蓋了

onDestroy: 這是activity被干掉前最后一個被調(diào)用方法了娃兽,可能是外面類調(diào)用finish方法或者是系統(tǒng)為了節(jié)省空間將它暫時性的干掉

十三菇民、onNewIntent在何時觸發(fā)尽楔?

十四投储、列舉一些你所知道的android實(shí)現(xiàn)異步的方法,并給出簡述

用Java來實(shí)現(xiàn)異步:主要有兩種方法來實(shí)現(xiàn)異步阔馋,繼承Thread類和實(shí)現(xiàn)Runnable接口

使用Android特有的方法來實(shí)現(xiàn)異步

AsyncTask和Handler

Rxjava

主線程發(fā)消息給子線程玛荞,也是比較類似的,只不過在子線程中呕寝,需要初始化Looper.prepare()和Looper.loop()勋眯。


十五、列舉一些你所知道的android進(jìn)程間通信下梢,線程間通信方式客蹋,并做簡單比較。

進(jìn)程間通訊方式:消息隊列( messagequeue ) : 消息隊列是由消息的鏈表孽江,存放在內(nèi)核中并由消息隊列標(biāo)識符標(biāo)識讶坯。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)岗屏。

線程間通訊方式# 鎖機(jī)制:包括互斥鎖辆琅、條件變量、讀寫鎖

# 信號量機(jī)制(Semaphore):包括無名線程信號量和命名線程信號量

十六这刷、handler在系統(tǒng)底層如何實(shí)現(xiàn)婉烟?子線程能否創(chuàng)建handler?如果可以暇屋,如何與主線程通信似袁?

1.Handler可以new 多個嗎?

Handler可以有多個

2.Looper可以有多個嗎?

Looper可以有多個,但是一個線程只有一個Looper

3.MessageQueue可以有多個嗎?

一個線程只能有一個

Handler通信

1.子線程與主線程通信

1.在子線程中調(diào)用send..,post…

2.在主線程中創(chuàng)建Looper(Looper.prepare),MessageQueue(Application給我們準(zhǔn)備好了,不需手動創(chuàng)建)

3.Handler,Looper,MessageQueue必須在一個線程

4.主線程收到調(diào)用結(jié)果

2.主線程與子線程通信

1.在主線程中調(diào)用send..,post…

2.在子線程中手動創(chuàng)建Looper(Looper.prepare),MessageQueue

3.Handler,Looper,MessageQueue必須在一個線程

4.子線程收到調(diào)用結(jié)果

3.子線程A與子線B程通信

A與B通信,A控制B


十七、對Mvc、mvp昙衅、mvvm屋彪、進(jìn)行比較,他們有什么優(yōu)缺點(diǎn)绒尊?


MVC:所有通信都是單向的畜挥。

MVP:1. 各部分之間的通信,都是雙向的婴谱。

2. View 與 Model 不發(fā)生聯(lián)系蟹但,都通過 Presenter 傳遞。

3. View 非常薄谭羔,不部署任何業(yè)務(wù)邏輯华糖,稱為"被動視圖"(Passive View),即沒有任何主動性瘟裸,而 Presenter非常厚客叉,所有邏輯都部署在那里。

MVVM:基本上與 MVP 模式完全一致话告。唯一的區(qū)別是兼搏,它采用雙向綁定(data-binding):View的變動,自動反映在 ViewModel沙郭,反之亦然佛呻。AngularEmber都采用這種模式。


十八病线、android有那些設(shè)計模式吓著?設(shè)計模式在android中有那些應(yīng)用?

建造者模式:建造者模式最明顯的標(biāo)志就是Build類送挑,如果一個類的構(gòu)造需要很多參數(shù)绑莺,而且這些參數(shù)并不都是必須的,那么這種情況下就比較適合Builder惕耕。

單例模式:以ActivityManager等系統(tǒng)服務(wù)來說纺裁,是通過靜態(tài)代碼塊的形式實(shí)現(xiàn)單例,在首次加載類文件時赡突,生成單例對象对扶,然后保存在Cache中,之后的使用都是直接從Cache中獲取惭缰。

工廠方法模式:靜態(tài)工廠方法在Android中比較明顯的例子應(yīng)該就是BitmapFactory了浪南,通過各種decodeXXX()就可以從不同渠道獲得Bitmap對象,

觀察者模式:Android里面的各種監(jiān)聽器漱受,也都屬于觀察者模式络凿,比如觸摸骡送、點(diǎn)擊、按鍵等絮记,

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摔踱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子怨愤,更是在濱河造成了極大的恐慌派敷,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撰洗,死亡現(xiàn)場離奇詭異篮愉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)差导,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門试躏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人设褐,你說我怎么就攤上這事颠蕴。” “怎么了助析?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵犀被,是天一觀的道長。 經(jīng)常有香客問我貌笨,道長弱判,這世上最難降的妖魔是什么襟沮? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任锥惋,我火速辦了婚禮,結(jié)果婚禮上开伏,老公的妹妹穿的比我還像新娘膀跌。我一直安慰自己,他們只是感情好固灵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布捅伤。 她就那樣靜靜地躺著,像睡著了一般巫玻。 火紅的嫁衣襯著肌膚如雪丛忆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天仍秤,我揣著相機(jī)與錄音熄诡,去河邊找鬼。 笑死诗力,一個胖子當(dāng)著我的面吹牛凰浮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼袜茧,長吁一口氣:“原來是場噩夢啊……” “哼菜拓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起笛厦,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤纳鼎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后裳凸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喷橙,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年登舞,在試婚紗的時候發(fā)現(xiàn)自己被綠了贰逾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡菠秒,死狀恐怖疙剑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情践叠,我是刑警寧澤言缤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站禁灼,受9級特大地震影響管挟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弄捕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一僻孝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧守谓,春花似錦穿铆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至平酿,卻和暖如春凤优,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜈彼。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工筑辨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柳刮。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓挖垛,卻偏偏與公主長得像痒钝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痢毒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,799評論 25 707
  • Android Studio JNI流程首先在java代碼聲明本地方法 用到native關(guān)鍵字 本地方法不用去實(shí)現(xiàn)...
    MigrationUK閱讀 11,848評論 7 123
  • 內(nèi)容來之網(wǎng)絡(luò)送矩,因?yàn)榭吹讲季痔珌y,重新整理下哪替,并對答案做了一些修改栋荸。如果有侵權(quán),請給我私信凭舶。謝謝晌块。 1.下列哪些語句...
    蝴蝶之夢天使閱讀 1,533評論 2 22
  • 1.下列哪些語句關(guān)于內(nèi)存回收的說明是正確的? (b )A、 程序員必須創(chuàng)建一個線程來釋放內(nèi)存 B帅霜、內(nèi)存回收程序負(fù)責(zé)...
    醉馬當(dāng)前闖閱讀 8,918評論 12 80
  • 如果不曾相遇 是不是就不會有現(xiàn)在的痛苦和無奈 當(dāng)初說寧愿錯了也不愿錯過 現(xiàn)在看來有這些東西寧可錯過了 留下期待中的...
    生如夏花_d113閱讀 171評論 0 1