前言
一年之計(jì)在于春 金三銀四已經(jīng)要到來(lái)苟鸯,2019的新的開(kāi)始同蜻,作為一個(gè)開(kāi)發(fā)人員,你是否面上了自己理想的公司早处,薪資達(dá)到心中理想的高度湾蔓?
如果沒(méi)有的話, 你就需要掌握更加成熟的技術(shù)砌梆,也需要更多的知識(shí)儲(chǔ)備卵蛉,對(duì)于我們上班族而言,工作的好壞就變得格外重要么库,想要拿高的工資傻丝,就好好的做好面試準(zhǔn)備,
以下是我為大家精心挑選的面試題诉儒,話不多說(shuō)葡缰,看東西。
正文
如何正確使用Handler忱反?
Handler的工作是依賴于Looper的泛释,而Looper(與消息隊(duì)列)又是屬于某一個(gè)線程(ThreadLocal是線程內(nèi)部的數(shù)據(jù)存儲(chǔ)類,通過(guò)它可以在指定線程中存儲(chǔ)數(shù)據(jù)温算,其他線程則無(wú)法獲取到)怜校,其他線程不能訪問(wèn)。因此Handler就是間接跟線程是綁定在一起了注竿。因此要使用Handler必須要保證Handler所創(chuàng)建的線程中有Looper對(duì)象并且啟動(dòng)循環(huán)茄茁。因?yàn)樽泳€程中默認(rèn)是沒(méi)有Looper的,所以會(huì)報(bào)錯(cuò)巩割。正確的使用方法是:
private Handler mHandler;
public Handler getHandler() {
return mHandler;
}
public void quit() {
mHandler.getLooper().quit();
}
@Override
public void run() {
super.run();
//創(chuàng)建該線程對(duì)應(yīng)的Looper,
// 內(nèi)部實(shí)現(xiàn)
// 1裙顽。new Looper()
// 2。將1步中的lopper 放在ThreadLocal里宣谈,ThreadLocal是保存數(shù)據(jù)的愈犹,主要應(yīng)用場(chǎng)景是:線程間數(shù)據(jù)互不影響的情況
// 3。在1步中的Looper的構(gòu)造函數(shù)中new MessageQueue();
//其實(shí)就是創(chuàng)建了該線程對(duì)用的Looper闻丑,Looper里創(chuàng)建MessageQueue來(lái)實(shí)現(xiàn)消息機(jī)制
//對(duì)消息機(jī)制不懂得同學(xué)可以查閱資料漩怎,網(wǎng)上很多也講的很不錯(cuò)勋颖。
Looper.prepare();
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.d("WorkThread", (Looper.getMainLooper() == Looper.myLooper()) + "," + msg.what);
}
};
//開(kāi)啟消息的死循環(huán)處理即:dispatchMessage
Looper.loop();
//注意這3個(gè)的順序不能顛倒
Log.d("WorkThread", "end");
}
}
自定義控件優(yōu)化方案
為了加速你的view,對(duì)于頻繁調(diào)用的方法勋锤,需要盡量減少不必要的代碼饭玲。先從onDraw開(kāi)始,需要特別注意不應(yīng)該在這里做內(nèi)存分配的事情怪得,因?yàn)樗鼤?huì)導(dǎo)致GC咱枉,從而導(dǎo)致卡頓。在初始化或者動(dòng)畫(huà)間隙期間做分配內(nèi)存的動(dòng)作徒恋。不要在動(dòng)畫(huà)正在執(zhí)行的時(shí)候做內(nèi)存分配的事情蚕断。
你還需要盡可能的減少onDraw被調(diào)用的次數(shù),大多數(shù)時(shí)候?qū)е耾nDraw都是因?yàn)檎{(diào)用了invalidate().因此請(qǐng)盡量減少調(diào)用invaildate()的次數(shù)入挣。如果可能的話亿乳,盡量調(diào)用含有4個(gè)參數(shù)的invalidate()方法而不是沒(méi)有參數(shù)的invalidate()。沒(méi)有參數(shù)的invalidate會(huì)強(qiáng)制重繪整個(gè)view径筏。
另外一個(gè)非常耗時(shí)的操作是請(qǐng)求layout葛假。任何時(shí)候執(zhí)行requestLayout(),會(huì)使得Android UI系統(tǒng)去遍歷整個(gè)View的層級(jí)來(lái)計(jì)算出每一個(gè)view的大小滋恬。如果找到有沖突的值聊训,它會(huì)需要重新計(jì)算好幾次。另外需要盡量保持View的層級(jí)是扁平化的恢氯,這樣對(duì)提高效率很有幫助带斑。如果你有一個(gè)復(fù)雜的UI,你應(yīng)該考慮寫(xiě)一個(gè)自定義的ViewGroup來(lái)執(zhí)行他的layout操作勋拟。與內(nèi)置的view不同勋磕,自定義的view可以使得程序僅僅測(cè)量這一部分,這避免了遍歷整個(gè)view的層級(jí)結(jié)構(gòu)來(lái)計(jì)算大小敢靡。這個(gè)PieChart 例子展示了如何繼承ViewGroup作為自定義view的一部分挂滓。PieChart 有子views,但是它從來(lái)不測(cè)量它們啸胧。而是根據(jù)他自身的layout法則赶站,直接設(shè)置它們的大小。
談?wù)勀銓?duì)Java三大特性的理解
封裝
封裝最好理解了吓揪。封裝是面向?qū)ο蟮奶卣髦磺椎。菍?duì)象和類概念的主要特性。
封裝柠辞,也就是把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作主胧,對(duì)不可信的進(jìn)行信息隱藏叭首。
繼承
面向?qū)ο缶幊?(OOP) 語(yǔ)言的一個(gè)主要功能就是“繼承”习勤。繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能,并在無(wú)需重新編寫(xiě)原來(lái)的類的情況下對(duì)這些功能進(jìn)行擴(kuò)展焙格。
通過(guò)繼承創(chuàng)建的新類稱為“子類”或“派生類”图毕。
被繼承的類稱為“基類”、“父類”或“超類”眷唉。
繼承的過(guò)程予颤,就是從一般到特殊的過(guò)程。
多態(tài)
多態(tài)性(polymorphisn)是允許你將父對(duì)象設(shè)置成為和一個(gè)或更多的他的子對(duì)象相等的技術(shù)冬阳,賦值之后蛤虐,父對(duì)象就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式運(yùn)作。簡(jiǎn)單的說(shuō)肝陪,就是一句話:允許將子類類型的指針賦值給父類類型的指針驳庭。
實(shí)現(xiàn)多態(tài),有二種方式氯窍,覆蓋饲常,重載。
覆蓋狼讨,是指子類重新定義父類的虛函數(shù)的做法贝淤。
重載,是指允許存在多個(gè)同名函數(shù)政供,而這些函數(shù)的參數(shù)表不同(或許參數(shù)個(gè)數(shù)不同播聪,或許參數(shù)類型不同,或許兩者都不同)鲫骗。
談?wù)凙ndroid的事件分發(fā)機(jī)制
事件的傳遞流程:
Activity(PhoneWindow)->DecorView->ViewGroup->View犬耻。
事件分發(fā)過(guò)程中三個(gè)重要的方法:
dispatchTouchEvent()、onInterceptTouchEvent()执泰、onTouchEvent()枕磁;
事件傳遞規(guī)則
一般一次點(diǎn)擊會(huì)有一系列的MotionEvent,可以簡(jiǎn)單分為:down->move->….->move->up,當(dāng)一次event分發(fā)到ViewGroup時(shí)术吝,ViewGroup收到事件后調(diào)用dispatchTouchEvent计济,在dispatchTouchEvent中先檢查是否要攔截,若攔截則ViewGroup處理事件排苍,否則交給有處理能力的子容器處理沦寂。
Android動(dòng)畫(huà)有幾種,對(duì)其理解
- 視圖動(dòng)畫(huà)淘衙。視圖移動(dòng)传藏、view真真的位置并未移動(dòng)。
- 幀動(dòng)畫(huà)。就和放電影一樣毯侦,一幀一幀的播
- 屬性動(dòng)畫(huà)哭靖。視圖移動(dòng)、其位置也會(huì)隨著移動(dòng)侈离。
- 觸摸返回動(dòng)畫(huà)试幽。發(fā)生觸摸事件時(shí)有反饋效果。比如波紋效果
- 揭露動(dòng)畫(huà)卦碾。從某一個(gè)點(diǎn)向四周展開(kāi)或者從四周向某一點(diǎn)聚合起來(lái)铺坞。
- 轉(zhuǎn)場(chǎng)動(dòng)畫(huà) & 共享元素。比如切換activity洲胖。共享元素一般我們使用在轉(zhuǎn)換的前后兩個(gè)頁(yè)面有共同元素時(shí)济榨。
- 視圖狀態(tài)動(dòng)畫(huà)。就是 View 在狀態(tài)改變時(shí)執(zhí)行的動(dòng)畫(huà)效果
- 矢量圖動(dòng)畫(huà)宾濒。在圖片的基礎(chǔ)上做動(dòng)畫(huà)腿短。
- 約束布局實(shí)現(xiàn)的關(guān)鍵幀動(dòng)畫(huà)。就是給需要?jiǎng)赢?huà)效果的屬性绘梦,準(zhǔn)備一組與時(shí)間相關(guān)的值橘忱。關(guān)鍵的幾個(gè)值。
最后
希望大家能有一個(gè)好心態(tài)卸奉,想進(jìn)什么樣的公司要想清楚钝诚,并不一定是大公司,我選的也不是特大廠榄棵。當(dāng)然如果你不知道選或是沒(méi)有規(guī)劃凝颇,那就選大公司!
希望我們能先選好想去的公司再投或內(nèi)推疹鳄,而不是有一個(gè)公司要我我就去拧略!還有就是不要害怕,也不要有壓力瘪弓,平常心對(duì)待就行垫蛆,但準(zhǔn)備要充足。最后希望大家都能拿到一份滿意的 offer 腺怯!如果目前有一份工作也請(qǐng)好好珍惜好好努力袱饭,找工作其實(shí)挺累挺辛苦的。