继续记录面试题

坐在工位,没事干心慌的不行,可能也是房贷压的。一闲下来就开始胡思乱想,无法沉下心去背那些八股文。这才刚刚接到离职通知第三天啊。而且、我还在坐班呢!!!  哎、怪不得有句老话说的,人穷志短,别人都说解放了 可以休息几天了。我是心焦、心慌、不停的刷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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 的一个模块…