一、如何避免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可以有多個
Looper可以有多個,但是一個線程只有一個Looper
一個線程只能有一個
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沙郭,反之亦然佛呻。Angular和Ember都采用這種模式。
十八病线、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)擊、按鍵等絮记,