繼續記錄面試題

坐在工位,沒事干心慌的不行,可能也是房貸壓的。一閑下來就開始胡思亂想,無法沉下心去背那些八股文。這才剛剛接到離職通知第三天啊。而且、我還在坐班呢!!!? 哎、怪不得有句老話說的,人窮志短,別人都說解放了 可以休息幾天了。我是心焦、心慌、不停的刷BOSS; 所以還是找點事情干,不然待壓抑死。看到boss廣場上有人發面試題,咱也就當自己去面試了,看看怎么回答。

目錄

面試官:能給我說說關于RecycleView的LayoutManager相關的嗎?

面試官:線程池中的線程如果銷毀

面試官:view繪制流程簡述下

面試官:簡述Binder原理

面試官:ActivityThread AMS WMS的工作原理

面試官:ContentProvider是如何實現數據共享的

面試官:能給我說說關于RecycleView的LayoutManager相關的嗎?

首先、LayoutManager是RecycleView的一個重要組件,負責子項布局和視圖回收。決定RecycleView的排列方式,內置了 線性、橫向、瀑布流等布局。特殊布局可以自定義LayoutManager;并且它還提供操作列表的相關api,比如獲取屏幕上可見的item位置,快速滾動等。

如果延伸,就是陳述下如何自定義LayoutManager。

自定義LayoutManager必須關注其核心方法 onLayoutChildren ; 這個方法是繼承LayoutManger必須實現的方法。它負責所有子Item的布局,也就是決定顯示那些Item,如果排列回收。一般都是數據變化時被調用。其次是 generateDefaultLayoutParams ; 返回默認布局參數,必須實現;其次就是是否可滑動、橫向、豎向等方法。

import android.content.Context
import android.util.Log
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerViewclass CustomLayoutManager : RecyclerView.LayoutManager() {// 必須實現,提供默認布局參數override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams {return RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT)}// 是否支持縱向滾動override fun canScrollVertically(): Boolean = true// 用于追蹤滑動偏移private var verticalScrollOffset = 0// 核心布局方法override fun onLayoutChildren(recycler: RecyclerView.Recycler,state: RecyclerView.State) {// 沒有item直接返回if (itemCount == 0) {detachAndScrapAttachedViews(recycler)return}// 回收所有子ViewdetachAndScrapAttachedViews(recycler)var offsetY = verticalScrollOffsetvar topOffset = -offsetY// 布局每一個itemfor (i in 0 until itemCount) {val view = recycler.getViewForPosition(i)addView(view)measureChildWithMargins(view, 0, 0)val width = getDecoratedMeasuredWidth(view)val height = getDecoratedMeasuredHeight(view)layoutDecorated(view, 0, topOffset, width, topOffset + height)topOffset += height// 超出下邊界不再布局if (topOffset > height + height) break}}// 縱向滑動處理override fun scrollVerticallyBy(dy: Int,recycler: RecyclerView.Recycler,state: RecyclerView.State): Int {val travel = dy// 更新偏移量verticalScrollOffset += travel// 限制滑動范圍if (verticalScrollOffset < 0) {verticalScrollOffset = 0}// 最大滑動到最后一個item底部val maxScroll = getTotalHeight() - heightif (verticalScrollOffset > maxScroll) {verticalScrollOffset = maxScroll}// 移動所有子ViewoffsetChildrenVertical(-travel)onLayoutChildren(recycler, state)return travel}// 計算所有item的總高度private fun getTotalHeight(): Int {var totalHeight = 0for (i in 0 until itemCount) {totalHeight += 100 // 這里假設每個item高度為100,可根據實際測量}return totalHeight}
}

上面是一個簡單的自定義LayoutManager 幫助大家理解。回答的話上面的話能說出來,基本算是過關了。

面試官:線程池中的線程如果銷毀

線程池中的線程由線程池統一管理,非核心線程空閑超過keepAliveTime會被自動銷毀,關閉線程時,所有線程會被完全銷毀,無需手動。銷毀線程池 shutdown 方法會等待提交任務,銷毀所有線程。shutdownNow方法會嘗試立即終止所有線程。

面試官:lock和syncrognized原理區別,適合什么場景。

synchronized 是JVM層面的內置鎖、適合簡單互斥場景。Lock是顯示鎖,功能更豐富,支持超時、中斷、公平鎖等,適合復雜的并發場景。

面試官:view繪制流程簡述下

View的繪制流程分為measure layout draw三個階段,分別是確定view的尺寸,位置、顯示內容。由ViewRootImpi遞歸完成整個view繪制。

其中measure 階段是 View 繪制流程的第一步,主要負責測量每個 View 的寬高。它通過 MeasureSpec 約束進行遞歸測量,最終每個 View 都會保存自己的尺寸,為后續 layout 和 draw 階段做準備;

面試官:簡述Binder原理

Binder是android的核心IPC機制,通過內核Binder驅動和序列化技術,實現不同進程間通訊,

追問:怎么Binder怎么做到一次copy的?

  • Binder 通過共享內存(mmap)機制實現一次拷貝:
    1. Client 進程和 Server 進程都通過 Binder 驅動映射一塊緩沖區到各自用戶空間。
    2. 客戶端寫數據到緩沖區,驅動只需把緩沖區引用傳遞給服務端。
    3. 服務端直接從映射區讀取數據,無需再做一次拷貝。
  • 數據流:Client 用戶空間 → Binder 映射區(內核空間) → Server 用戶空間(同一塊物理內存)
  • 這樣只需一次物理內存拷貝,大大提升了 IPC 性能。

面試官:ActivityThread AMS WMS的工作原理

ActivityThread 是應用進程的主線程管理類,負責組件創建和消息分發。AMS 運行在 system_server,負責 Activity 和進程的調度與生命周期管理。WMS 管理所有窗口的顯示、層級和輸入事件。三者通過 Binder 通信,協作實現應用的啟動、界面顯示和系統調度

面試官:ContentProvider是如何實現數據共享的

ContentProvider 提供了統一的訪問接口(CRUD:query、insert、update、delete),其他應用可通過標準 URI 訪問其數據

首次面試歸來,微信視頻面試。緊張、還有就是對于自己的認知;真的是不學習新技術就要落后。現在主流是kotlin,而我真正的kotlin項目是 18年。這就比較尷尬,對于現在kotlin的新特性,高階函數一問三不知。另外,對于自己的語言表達能力表示唾棄~ 真的太久不和人交流,語言組織能力就會退化。

面試官問:講下你現在的項目框架搭建。

我當前項目是一個地圖類應用,采用了組件化架構MVVM模式;項目組件化架構分為Library,和module ,其中library是公共組件部分,比如網絡庫組件、數據庫組件、widget 通用組件,base組件等。而Module是對業務的拆分,如首頁、組隊、算路、導航等。每個組件獨立開發,維護。我在團隊中負責 框架搭建、Library庫開發維護;

其實目前框架的技術選型有點問題,我們是地圖類項目,要求整個項目共用一個主圖,那么就只能采用單Activity+NFragment,但是有使用了組件化架構導致Fragment的退出棧都需要自己去管理,并且地圖的管理也需要抽出管理類。

面試官:那你們是怎么管理的?

我們采用多個單利去管理比如FragmentController、MapController ,這些管理類堆積在Base組件內,滿足每個業務組件的調用。我們把對于Fragment、或這地圖的操作都由這兩個管理去控制,模塊自身不允許直接操控 map。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93582.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93582.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93582.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零開始學習:深度學習(基礎入門版)(第2天)

&#xff08;一&#xff09;在pycharm軟件中&#xff0c;用python語言&#xff0c;opencv庫實現以下功能(1.1)圖片的邊界填充核心流程&#xff1a;讀取原始圖像使用 cv2.imread() 加載名為 yueshan.png 的圖像文件統一邊界參數設定四周留白尺寸均為 50px&#xff08;上下左右各…

HTTP協議-3-HTTP/2是如何維持長連接的?

先說結論&#xff1a;HTTP/2的“長連接” 一個TCP連接 多路復用 二進制幀 流控制 持久會話管理 它不只是“連接不斷”&#xff0c;更關鍵的是&#xff1a;在這個長連接上&#xff0c;可以同時并發傳輸成百上千個請求和響應&#xff0c;互不阻塞&#xff01; 1、HTTP/2的“…

圖解希爾排序C語言實現

1 希爾排序 希爾排序&#xff08;Shell Sort&#xff09;是D.L.Shell于1959年提出來的一種排序算法&#xff0c;在這之前排序算法的時間復雜度基本都是O(n)&#xff0c;希爾排序算法是突破這個時間復雜度的第一批算法之一。 1.1 基本概念與原理 希爾排序通過將原始列表分割成若…

網絡協議——HTTPS協議

目錄 一、HTTPS是什么 加密是什么 二、HTTPS的工作過程 &#xff08;一&#xff09;對稱加密 &#xff08;二&#xff09;非對稱加密 &#xff08;三&#xff09;在非對稱加密的基礎上&#xff0c;引入證書校驗 證書是什么 證書的內容 用證書解決中間人攻擊 三、總結 …

React 基礎實戰:從組件到案例全解析

React 基礎實戰專欄:從組件到案例全解析 本專欄圍繞 React 核心概念(組件、Props、State、生命周期)展開,通過 6個實戰案例+核心知識點拆解,幫你掌握 React 基礎開發邏輯,每篇聚焦1個實戰場景,搭配完整代碼與原理講解,適合 React 入門者鞏固基礎。 專欄目錄 【組件傳…

ARM芯片架構之CoreSight Channel Interface 介紹

CoreSight Channel Interface&#xff08;通道接口&#xff09;詳解1. 概述 Channel Interface 是 ARM CoreSight 架構中用于在不同組件之間傳遞觸發事件的專用接口。它是 Event Interface 的增強版本&#xff0c;支持多通道、雙向通信&#xff0c;以及同步與異步兩種時鐘域連接…

Blender模擬結構光3D Scanner(二)投影儀內參數匹配

關于投影儀外參的設置可參見前一篇文章 Blender模擬結構光3D Scanner&#xff08;一&#xff09;外參數匹配-CSDN博客 使用Projectors插件模擬投影儀 Step 1 在Github下載插件&#xff08;https://github.com/Ocupe/Projectors&#xff09;。下載zip壓縮包即可&#xff0c;無…

synchronized的作用

目錄 一、核心作用 二、實現原理&#xff1a;基于"對象鎖" 三、使用方式 四、鎖的優化 五、優缺點 六、總結 synchronized 是 Java 中用于解決多線程并發安全問題的核心關鍵字&#xff0c;它的主要作用是實現線程間的同步&#xff0c;確保多個線程在訪問共享資…

機試備考筆記 14/31

2025年8月14日 小結&#xff1a;&#xff08;17號整理14號的筆記&#xff0c;這輩子真是有了w(&#xff9f;Д&#xff9f;)w&#xff09;昨天摔了跤大的&#xff0c;今天好媽媽在家&#xff0c;松弛。省流&#xff1a;6道中等&#xff0c;明天只學了10分鐘嘻嘻 目錄LeetCode22…

dolphinscheduler中任務輸出變量的問題出現ArrayIndexOutOfBoundsException

一段腳本任務如下&#xff1a;ret/data/dolphinscheduler/loadOraTable.sh "yonbip/yonbip10.16.10.69:1521/orcl" "select t.bondcontractno,t.olcunissuemny from yonbip.bond_contract t " "/dmp/biz" "bip" "2025-08-13"…

OpenCv(二)——邊界填充、閾值處理

目錄 一、邊界填充&#xff08;Border Padding&#xff09; 1. 常見填充類型及效果 2.代碼示例 &#xff08;1&#xff09;constant邊界填充&#xff0c;填充指定寬度的像素 &#xff08;2&#xff09;REFLECT鏡像邊界填充 &#xff08;3&#xff09;REFLECT_101鏡像邊界…

Leetcode 15 java

今天復習一下翻轉二叉樹 226. 翻轉二叉樹 給你一棵二叉樹的根節點 root &#xff0c;翻轉這棵二叉樹&#xff0c;并返回其根節點。 示例 1&#xff1a; 輸入&#xff1a;root [4,2,7,1,3,6,9] 輸出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 輸入&#xff1a;root [2…

嵌入式學習的第四十九天-時鐘+EPIT+GPT定時器

一、時鐘1.時鐘系統基本概念&#xff08;1&#xff09;PLL (鎖相環, Phase-Locked Loop)作用&#xff1a;PLL是一種反饋控制電路&#xff0c;用于生成穩定的高頻時鐘信號。它通過將輸出時鐘與參考時鐘進行比較和調整&#xff0c;可以產生比輸入參考時鐘頻率高得多的輸出時鐘。倍…

Python Sqlalchemy數據庫連接

Python Sqlalchemy數據庫連接一、連接數據二、模型三、ORM操作一、連接數據 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker# 1. 連接數據庫 dbHost postgres://用戶名:密碼主機:端口/數據庫名 engine create_engine(dbHost) # create_engi…

【Node.js】ECMAScript標準 以及 npm安裝

目錄 一、 ECMAScript標準 - 默認導出和導入 二、ECMAScript標準 - 命名導出和導入 三、包的概念 五、 npm - 安裝所有依賴 六、 npm - 全局軟件包 Node.js總結 總結不易~ 本章節對我有很大的收獲&#xff0c; 希望對你也是&#xff01;&#xff01;&#xff01; 本節素材…

NPM 、 NPX

NPM vs. NPX 簡單來說&#xff0c;npm 是一個 node 包管理器&#xff0c;npx 是一個 Node 包執行器。 NPX 是一個 Node 包執行器&#xff0c;該 Node 包可以是本地也可以是遠程的。允許開發者在無需安裝的情況下執行任意 Node 包。npm 在安裝nodejs 就自動帶了 npm install -g …

守護品質安全,防偽溯源系統打造全鏈路信任體系

一、引言在當下這個信息透明、品質至上的時代&#xff0c;防偽溯源已經成為眾多品牌保護自身利益、提升消費者信任度的重要手段。為了滿足市場上對高效、可靠的防偽溯源查詢系統的迫切需求&#xff0c;榕壹云精心打造了一款防偽溯源查詢系統。二、項目背景隨著商品市場的不斷擴…

【完整源碼+數據集+部署教程】無人機航拍視角洪水檢測與受災房屋識別圖像分割救援指導系統源碼和數據集:改進yolo11-DCNV2

背景意義 研究背景與意義 隨著全球氣候變化的加劇&#xff0c;極端天氣事件的頻率和強度不斷上升&#xff0c;洪水作為一種常見的自然災害&#xff0c;給人類社會帶來了嚴重的威脅。洪水不僅導致人員傷亡和財產損失&#xff0c;還對基礎設施和生態環境造成了深遠的影響。因此&a…

C# 結構體與類的區別是什么?

結構體是值類型是儲存在棧中獨立儲存的,數據與數據之間不會相互影響,即使將一個結構體賦值給另外一個結構體也不會相互影響。 類是一個模板,實例出來的對象是獨立的不會相互影響,但是將一個對象賦值給另一個對象時 會把指向堆內存中數據的指針賦值給另一個對象.從而發生兩個變量…

Redis GEO

Redis GEO 引言 Redis 是一款高性能的鍵值存儲系統,廣泛應用于緩存、消息隊列等領域。Redis GEO 是 Redis 2.4 版本后新增的一個功能,用于存儲地理位置信息。本文將詳細介紹 Redis GEO 的概念、使用方法以及應用場景。 什么是 Redis GEO? Redis GEO 是 Redis 的一個模塊…