Android面试总结经
? ??自上周怒辭職以后,就開始苦逼的各種面試生涯,生活全然靠私活來接濟,時有時沒有,真難。還能快樂的玩耍嗎。最多一天面試了5家,哎感覺都是不急招人,各種等待通知。好不easy等來一家。還克扣了薪資,從我要的12k到他們給8k,感覺累覺不愛。
? ? ?面試都是基本過了二面的,大到騰訊,阿里。百度。網易,小到15人的創業公司我都去了,難得今天歇息一下。總結以下試經驗。以便下次面試用到。技術題目我就不說了,這是基礎。不會的還是把基礎看下吧。后面的題目都是讓人蛋疼的機制問題。
? ??1、什么是線程。線程和進程的差別,線程的工作原理
?線程就是程序運行流中最小單元。是系統獨立調度的基本單位,線程不具有不論什么系統資源。這里須要特別注意,
就象程序一樣,線程有生命周期:它們啟動、運行,然后完畢。一個程序或進程或許包括多個線程。而這些線程看來互相單獨地運行。
線程是通過實例化Thread對象或實例化繼承Thread的對象來創建的。但在對新的Thread對象調用start()方法之前,這個線程并沒有開始執行。當線程執行到其run()方法的末尾或拋出未經處理的異常時,它們就結束了。
sleep()方法能夠用于等待一段特定時間;而join()方法可能用于等到還有一個線程完畢。
線程的一些基本方法:
isAlive():推斷線程是否還"活"著
? ?getPriority():獲得線程的優先級數值
? ?setPriority():設置線程的優先級數值
? ?Thread.sleep():將當前線程睡眠指定毫秒數
? ?join():調用某線程的該方法,將當前線程與該線程"合并",即等待該線程結束,再恢復當前線程的執行
? ?yield():讓出cpu,當前線程進入就緒隊列等待調度
? ?wait():當前線程進入對象的wait pool
? ?notify()/notifyAll():喚醒對象的wait pool中的一個/全部等待線程
特別注意sleep和wait的差別:
Wait是Object類的方法,范圍是使該Object實例所處的線程。
Sleep()是Thread類專屬的靜態方法,針對一個特定的線程。
Wait方法使實體所處線程暫停執行,從而使對象進入等待狀態,直到被notify方法通知或者wait的等待的時間到。Sleep方法使持有的線程暫停執行。從而使線程進入休眠狀態。直到用interrupt方法來打斷他的休眠或者sleep的休眠的時間到。
線程和進程的差別:
(1)地址空間:進程內的一個運行單元;進程至少有一個線程;它們共享進程的地址空間;而進程有自己獨立的地址空間;
(2)資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
(3)線程是處理器調度的基本單位,但進程不是.
?
多線程
很多線程在運行中必須考慮與其它線程之間共享數據或協調運行狀態。這就須要同步機制。
在Java中每一個對象都有一把鎖與之相應。
synchronized語句計算一個對象引用,試圖對該對象完畢鎖操作, 而且在完畢鎖操作前停止處理。當鎖操作完畢synchronized語句體得到運行。當語句體運行完畢(不管正?;虍惓?,解鎖操作自己主動完畢。
作為面向對象的語言,synchronized常常與方法連用。一種比較好的辦法是,假設某個變量由一個線程賦值并由別的線程引用或賦值,那么全部對該變量的訪問都必須在某個synchromized語句或synchronized方法內。
2、怎樣去理解handler,message,messagequeen,looper,一個message是否有幾個looper,你寫過looper沒有。
1、MessageQueue:是一種數據結構,見名知義。就是一個消息隊列,存放消息的地方。每個線程最多僅僅能夠擁有一個MessageQueue數據結構。創建一個線程的時候,并不會自己主動創建其MessageQueue。通常使用一個Looper對象對該線程的MessageQueue進行管理。
主線程創建時,會創建一個默認的Looper對象,而Looper對象的創建。將自己主動創建一個Message Queue。
其它非主線程。不會自己主動創建Looper,要須要的時候,通過調用prepare函數來實現。
2、Message:消息對象,Message Queue中的存放的對象。
一個Message Queue中包括多個Message。Message實例對象的取得。通常使用Message類里的靜態方法obtain(),該方法有多個重載版本號可供選擇;它的創建并不一定是直接創建一個新的實例,而是先從Message Pool(消息池)中看有沒有可用的Message實例,存在則直接取出返回這個實例。
假設Message Pool中沒有可用的Message實例,則才用給定的參數創建一個Message對象。
調用removeMessages()時,將Message從Message Queue中刪除,同一時候放入到Message Pool中。
除了上面這樣的方式,也能夠通過Handler對象的obtainMessage()獲取一個Message實例。
3、Looper:
是MessageQueue的管理者。每個MessageQueue都不能脫離Looper而存在,Looper對象的創建是通過prepare函數來實現的。
同一時候每個Looper對象和一個線程關聯。通過調用Looper.myLooper()能夠獲得當前線程的Looper對象創建一個Looper對象時。會同一時候創建一個MessageQueue對象。除了主線程有默認的Looper。其它線程默認是沒有MessageQueue對象的,所以,不能接受Message。如須要接受。自定義一個Looper對象(通過prepare函數),這樣該線程就有了自己的Looper對象和MessageQueue數據結構了。Looper從MessageQueue中取出Message然后,交由Handler的handleMessage進行處理。
處理完畢后,調用Message.recycle()將其放入Message Pool中。
4、Handler:
消息的處理者,handler負責將須要傳遞的信息封裝成Message。通過調用handler對象的obtainMessage()來實現。將消息傳遞給Looper,這是通過handler對象的sendMessage()來實現的。繼而由Looper將Message放入MessageQueue中。
當Looper對象看到MessageQueue中含有Message,就將其廣播出去。該handler對象收到該消息后,調用對應的handler對象的handleMessage()方法對其進行處理。
3子線程和UI線程的差別,子線程的工作原理。怎樣更改UI。
???????? 這個比較簡單一些,了解了上面的內容就知道子線程發送message,通過handler的handleMessage方法去獲取message然后更新UI。
4遇到過OOM沒有,舉個你優化OOM的樣例,
???????? Oom是指內存溢出,普通情況是圖片過大造成的。
解決方式:
(1)緩存圖像到內存,採用軟引用緩存到內存,而不是在每次使用的時候都從新載入到內存。
(2)調整圖像大小。手機屏幕尺寸有限,分配給圖像的顯示區域本身就更小,有時圖像大小能夠做適當調整;
(3)採用低內存占用量的編碼方式。比方Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省內存;
(4)及時回收圖像,假設引用了大量Bitmap對象。而應用又不須要同一時候顯示全部圖片,能夠將臨時用不到的Bitmap對象及時回收掉。
(5)自己定義堆內存分配大小,優化Dalvik虛擬機的堆內存分配。
5GC的工作原理
???????? Garbage Collection簡稱為GC,是垃圾回收的意思、內存處理器是編程人員easy出現故障的地方。忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰。Java語言提供的GC功能能夠自己主動的檢測對象是否超過作用域。從而達到自己主動回收內存的目的,java語言沒有提供釋放已分配內存的顯示操作方法,資源回收工作所有交由GC來完畢。程序猿不能精確的控制垃圾回收的時機。
GC在實現垃圾回收時的基本原理:
Java的內存管理實際就是對象的管理。當中包含對像的分配和釋放。對于程序猿來說。分配對象使用newkeyword,釋放對象時僅僅是將對象賦值為null,讓程序猿不可以再訪問到這個對象,該對象被稱為“不可達”。
GC將負責回收全部“不可達”對象的內存空間。
對于GC來說,當程序猿創建對象時,GC就開始監控這個對象地址、大小以及使用情況。通常GC採用有向圖的方式記錄并管理堆中的全部對象,通過這樣的方式確定哪些對象是“可達”的,哪些對象是“不可達”的。當GC確定一些對象為“不可達時”GC就有責任回收這些內存空間,但為了GC可以在不同的平臺上實現,java規范對GC的非常多行為都沒有進行嚴格的規定。比如對于採用什么類型的回收算法、什么時候進行回收等重要問題都沒有明白的規定,因此不同的JVM實現著不同的的實現算法。這也給JAVA程序猿的開發帶來了非常多不確定性。
依據GC的工作原理,能夠通過一些技巧和方式讓GC執行更快,高效而又合理。編程建議例如以下:
1、盡早釋放無用對象的引用,特別注意一些復雜對象,如數組。隊列等。
對于此類對象,GC回收它們的效率一般較低,假設程序同意,應盡早將不用的引用對象賦為null,這樣能夠加速GC的工作。
2、盡量少用finalize函數。
finalize是java提供給程序猿用來釋放對象或資源的函數,可是它會加大GC的工作量,因此盡量少採用finalize函數回收資源。
6說下你的IPC通信的理解
Android系統中大量使用了基于C/S模式的通信方式。諸如短信操作,電話操作,視頻音頻捕獲,傳感器等都以服務(Service)的形式提供,并由對應的Server負責管理,應用程序作為Client僅僅須要與這些Server建立連接并發送請求便能使用這些服務。因此,開發人員全然不必關心Service的實現細節,直接與Server建立連接然后使用其提供的接口就可以。
Client和Server通常是執行在不同的進程中的。這就涉及到進程間通信(IPC,Inter-ProcessCommunication)。為了保證系統安全性。提高通信效率以及提供對C/S模式的支持,Android採用了一種基于共享內存的IPC機制——Binder機制。
詳細的實現方法就是AIDL,這屬于技術方面了。不懂的能夠百度。
7http和tcp通信的你做過什么項目
???????? http重點是url和httpclient。
狀態碼為1這一類型的狀態碼。代表請求已被接受。須要繼續處理。這類響應是暫時響應,僅僅包括狀態行和某些可選的響應頭信息。并以空行結束。
???????? 狀態碼為2這一類型的狀態碼,代表請求已成功被server接收、理解、并接受。
???????? 狀態碼為3這類狀態碼代表須要client採取進一步的操作才干完畢請求。
通常,這些狀態碼用來重定向,興許的請求地址(重定向目標)在本次響應的 Location 域中指明。
???????? 狀態碼為4為錯誤碼
???????? 狀態碼為5server錯誤
?
???????? TCP重點就是sokect。
8復寫過view嗎?viewgourp里面有些什么方法?
???????? 自己定義view重要的是復寫ondraw方法。
???????? View是繼承viewgroup的,所以復寫viewgroup能實現我們想要一切東西,viewgroup基本的方法:
???????? Onlayout()方法負責把該view放在參數指定位置。
???????? onMeasure()方法不但能夠為ViewGroup指定大小。還能夠通過遍歷為每個子View指定大小。在自己定義ViewGroup中加入上面代碼為ViewGroup中的每個子View分配了顯示的寬高。
???????? onDraw重繪view
? ? ? ? ?
轉載于:https://www.cnblogs.com/cxchanpin/p/6734764.html
總結
以上是生活随笔為你收集整理的Android面试总结经的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试工程师职业发展方向及前景
- 下一篇: 给初次参加全国大学生智能汽车竞赛的同学们