Android中的Serializable、Parcelable">Android中的Serializable、Parcelable
912
2022-05-30
(授權轉載)微信碼個蛋授權轉載
以下原文:
碼個蛋(codeegg)第 611 次推文
碼個蛋,碼上養(yǎng)成好習慣!
碼個蛋?社群升級已經將近兩個月了,通過兩個月的觀察,感覺群友們每天學習的積極性都是很高的,每天的活躍度也很高(當然不是吹水)基本上大家討論的都是跟學習相關的內容
期間通過群友投票,我們選出了?碼個蛋?新的solgan:碼個蛋,碼上養(yǎng)成好習慣!
為了幫助大家養(yǎng)成好習慣,碼仔們自發(fā)在社群里提出了每日一問!每天一道面試題!然后收錄大家的答案整合到一起,方便大家的學習和復習。
為了讓大家更方便的找到每日問題,碼仔決定在公號內推出一個新的文章系列:《每周面試題總結》
這個系列是整合在碼個蛋學習群里面的每日一題,這篇是第一周整理集合,后續(xù)每周都會更新。
學習群詳細可見:《社群升級:Max你的學習效率》
如何正確使用Handler?
Handler的工作是依賴于Looper的,而Looper(與消息隊列)又是屬于某一個線程(ThreadLocal是線程內部的數據存儲類,通過它可以在指定線程中存儲數據,其他線程則無法獲取到),其他線程不能訪問。因此Handler就是間接跟線程是綁定在一起了。因此要使用Handler必須要保證Handler所創(chuàng)建的線程中有Looper對象并且啟動循環(huán)。因為子線程中默認是沒有Looper的,所以會報錯。正確的使用方法是:
private final class WorkThread extends Thread {
private Handler mHandler;
public Handler getHandler() {?return mHandler;?}?public void quit() {mHandler.getLooper().quit();?}?@Override?public void run() {?super.run();?//創(chuàng)建該線程對應的Looper,?// 內部實現?// 1。new Looper()?// 2。將1步中的lopper 放在ThreadLocal里,ThreadLocal是保存數據的,主要應用場景是:線程間數據互不影響的情況?// 3。在1步中的Looper的構造函數中new MessageQueue();?//其實就是創(chuàng)建了該線程對用的Looper,Looper里創(chuàng)建MessageQueue來實現消息機制?//對消息機制不懂得同學可以查閱資料,網上很多也講的很不錯。?Looper.prepare();mHandler = new Handler() {?@Override?public void handleMessage(Message msg) {super.handleMessage(msg);?Log.d("WorkThread", (Looper.getMainLooper() == Looper.myLooper()) + "," + msg.what);?}?};?//開啟消息的死循環(huán)處理即:dispatchMessageLooper.loop();?//注意這3個的順序不能顛倒?Log.d("WorkThread", "end");?}?}
自定義控件優(yōu)化方案
為了加速你的view,對于頻繁調用的方法,需要盡量減少不必要的代碼。先從onDraw開始,需要特別注意不應該在這里做內存分配的事情,因為它會導致GC,從而導致卡頓。在初始化或者動畫間隙期間做分配內存的動作。不要在動畫正在執(zhí)行的時候做內存分配的事情。
你還需要盡可能的減少onDraw被調用的次數,大多數時候導致onDraw都是因為調用了invalidate().因此請盡量減少調用invaildate()的次數。如果可能的話,盡量調用含有4個參數的invalidate()方法而不是沒有參數的invalidate()。沒有參數的invalidate會強制重繪整個view。
另外一個非常耗時的操作是請求layout。任何時候執(zhí)行requestLayout(),會使得Android UI系統(tǒng)去遍歷整個View的層級來計算出每一個view的大小。如果找到有沖突的值,它會需要重新計算好幾次。另外需要盡量保持View的層級是扁平化的,這樣對提高效率很有幫助。如果你有一個復雜的UI,你應該考慮寫一個自定義的ViewGroup來執(zhí)行他的layout操作。與內置的view不同,自定義的view可以使得程序僅僅測量這一部分,這避免了遍歷整個view的層級結構來計算大小。這個PieChart 例子展示了如何繼承ViewGroup作為自定義view的一部分。PieChart 有子views,但是它從來不測量它們。而是根據他自身的layout法則,直接設置它們的大小。
談談你對Java三大特性的理解
封裝
封裝最好理解了。封裝是面向對象的特征之一,是對象和類概念的主要特性。
封裝,也就是把客觀事物封裝成抽象的類,并且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。
繼承
面向對象編程 (OOP) 語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進行擴展。
通過繼承創(chuàng)建的新類稱為“子類”或“派生類”。
被繼承的類稱為“基類”、“父類”或“超類”。
繼承的過程,就是從一般到特殊的過程。
多態(tài)
多態(tài)性(polymorphisn)是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之后,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。
實現多態(tài),有二種方式,覆蓋,重載。
覆蓋,是指子類重新定義父類的虛函數的做法。
重載,是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。
談談Android的事件分發(fā)機制
事件的傳遞流程:
Activity(PhoneWindow)->DecorView->ViewGroup->View。
事件分發(fā)過程中三個重要的方法:
dispatchTouchEvent()、onInterceptTouchEvent()、onTouchEvent();
事件傳遞規(guī)則
一般一次點擊會有一系列的MotionEvent,可以簡單分為:down->move->….->move->up,當一次event分發(fā)到ViewGroup時,ViewGroup收到事件后調用dispatchTouchEvent,在dispatchTouchEvent中先檢查是否要攔截,若攔截則ViewGroup處理事件,否則交給有處理能力的子容器處理。
Android動畫有幾種,對其理解
視圖動畫。視圖移動、view真真的位置并未移動。
幀動畫。就和放電影一樣,一幀一幀的播
屬性動畫。視圖移動、其位置也會隨著移動。
觸摸返回動畫。發(fā)生觸摸事件時有反饋效果。比如波紋效果
揭 露動畫。從某一個點向四周展開或者從四周向某一點聚合起來。
轉場動畫 & 共享元素。比如切換activity。共享元素一般我們使用在轉換的前后兩個頁面有共同元素時。
視圖狀態(tài)動畫。就是 View 在狀態(tài)改變時執(zhí)行的動畫效果
矢量圖動畫。在圖片的基礎上做動畫。
約束布局實現的關鍵幀動畫。就是給需要動畫效果的屬性,準備一組與時間相關的值。關鍵的幾個值。
結束語
如果你有好的答案可以提交至:
https://github.com/codeegginterviewgroup/CodeEggDailyInterview
本文轉載自異步社區(qū)。
Java Android
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。