Android 面試題Handler、自定義View、Java三大特性、分發(fā)機制、動畫(第1期)

      網友投稿 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ā)過程中三個重要的方法:

      Android 面試題:Handler、自定義View、Java三大特性、分發(fā)機制、動畫(第1期)

      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小時內刪除侵權內容。

      上一篇:《可穿戴計算:基于人體傳感器網絡的可穿戴系統(tǒng)建模與實現》 —1.7 通信標準
      下一篇:Gazebo與ROS版本說明
      相關文章
      亚洲国产一级在线观看| 精品久久久久久亚洲| 亚洲午夜AV无码专区在线播放| 亚洲欧美日韩综合久久久| 久久亚洲AV成人出白浆无码国产| 伊人久久大香线蕉亚洲五月天| 亚洲女人被黑人巨大进入| 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲毛片网址在线观看中文字幕 | 亚洲av无码片vr一区二区三区| 亚洲日本人成中文字幕| 亚洲视频一区在线播放| 亚洲网红精品大秀在线观看| 久久精品亚洲精品国产色婷| 久久精品国产亚洲AV电影| 97久久精品亚洲中文字幕无码| 亚洲人成网站在线播放影院在线| 亚洲成年人在线观看| 老司机亚洲精品影院| 亚洲美女免费视频| 亚洲乱码中文论理电影| 亚洲国产精品一区二区三区在线观看| 亚洲日本国产综合高清| 亚洲成a人无码亚洲成www牛牛 | 精品国产亚洲一区二区三区在线观看 | 亚洲AV无码AV男人的天堂| 亚洲AV日韩AV永久无码下载| 亚洲精品自产拍在线观看动漫| 亚洲人成电影福利在线播放| 亚洲色图校园春色| 亚洲午夜一区二区三区| 亚洲中文字幕久久久一区| 人人狠狠综合久久亚洲| 国产精品亚洲mnbav网站| 亚洲人成伊人成综合网久久久| 久久久久久久久亚洲| 亚洲国产精品综合一区在线| 亚洲视频无码高清在线| 国产天堂亚洲精品| 亚洲色婷婷综合久久| 亚洲男人天堂av|