Android第三次面试总结(activity和线程池)
1. Activity 的生命周期方法有哪些?调用顺序是什么?
- 回答思路:列举 7 个核心方法并说明其触发场景。
- 回答示例:
- 完整生命周期:
onCreate()→onStart()→onResume()→onPause()→onStop()→onDestroy()。 - 可见但非前台:
onPause()→onStop()(若用户离开但未完全退出)。 - 返回前台:
onRestart()→onStart()→onResume()。
- 完整生命周期:
2. 启动新 Activity 时,原 Activity 的生命周期如何变化?
- 回答思路:区分目标 Activity 是否为透明主题。
- 回答示例:
- 非透明主题:原 Activity 执行
onPause()→onStop()(进入后台)。 - 透明主题:原 Activity 仅执行
onPause()(保持部分可见)。 - 目标 Activity:
onCreate()→onStart()→onResume()。
- 非透明主题:原 Activity 执行
3. 按下 Back 键返回时,生命周期如何变化?
- 回答思路:描述返回栈的弹出过程。
- 回答示例:
- 目标 Activity:
onPause()→onStop()→onDestroy()(被销毁)。 - 原 Activity:
onRestart()→onStart()→onResume()(恢复前台)。
- 目标 Activity:
4. 屏幕旋转时,Activity 的生命周期会发生什么变化?如何避免重启?
- 回答思路:解释配置变更的默认行为及解决方案。
- 回答示例:
- 默认行为:Activity 被销毁并重建,调用
onPause()→onStop()→onDestroy()→onCreate()→onStart()→onResume()。 - 避免重启:
- 在 AndroidManifest.xml 中设置:
- 默认行为:Activity 被销毁并重建,调用
<activity android:name=".MainActivity"android:configChanges="orientation|screenSize" />
通过onSaveInstanceState()保存临时状态,onRestoreInstanceState()恢复。
5. 当 Activity 被系统回收后重新打开,生命周期如何变化?
- 回答思路:说明低内存场景下的回收机制。
- 回答示例:
- 回收时:Activity 可能仅执行
onPause()→onStop()(未执行onDestroy())。 - 重新打开:调用
onCreate()→onStart()→onResume(),需通过onSaveInstanceState()恢复数据。
- 回收时:Activity 可能仅执行
6. Activity 进入后台再回到前台时,生命周期如何变化?
- 回答思路:区分短暂离开和长期后台。
- 回答示例:
- 短暂离开(如按 Home 键):
- 后台:
onPause()→onStop()。 - 返回前台:
onRestart()→onStart()→onResume()。
- 后台:
- 长期后台(系统回收):需重新创建 Activity 实例。
- 短暂离开(如按 Home 键):
7. onSaveInstanceState () 和 onRestoreInstanceState () 的作用是什么?
- 回答思路:强调状态保存与恢复的场景。
- 回答示例:
- 调用时机:
onSaveInstanceState():在onStop()或onDestroy()前调用(非主动销毁时,如用户按 Back 键不会触发)。onRestoreInstanceState():在onStart()之后调用。
- 用途:保存临时数据(如 EditText 内容),不适合保存持久化数据。
- 调用时机:
8. 如何处理 Activity 被回收后的状态恢复?
- 回答思路:结合 ViewModel 和 onSaveInstanceState。
- 回答示例:
- ViewModel:保存与界面相关的业务逻辑数据。
- onSaveInstanceState:保存 UI 状态(如滚动位置)。
- 持久化存储:通过 SharedPreferences 或数据库保存关键数据。
9. 启动模式(launchMode)如何影响生命周期?
- 回答思路:以 singleTask 为例说明栈管理的影响。
- 回答示例:
- singleTask 模式:若 Activity 已存在于栈中,会调用
onNewIntent()而非重新创建,生命周期回调为onPause()→onStop()→onNewIntent()→onRestart()→onStart()→onResume()。
- singleTask 模式:若 Activity 已存在于栈中,会调用
下列是线程池相关面试题:
1.什么是线程池?为什么要使用线程池?
- 回答思路:先给出线程池的定义,再阐述使用线程池的好处。
- 回答示例:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建的线程集合中启动这些任务。使用线程池主要有以下好处:
- 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
- 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。
- 提高线程的可管理性:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。
2. 线程池的工作原理是什么?
- 回答思路:按照任务提交的顺序,依次说明线程池如何处理任务,包括核心线程、任务队列和最大线程数的关系。
- 回答示例:当向线程池提交一个任务时,线程池的处理流程如下:
- 若线程池中的线程数量少于核心线程数,线程池会立即创建一个新线程来执行该任务。
- 若线程数量达到核心线程数,新任务会被放入任务队列中等待执行。
- 若任务队列已满,且线程数量小于最大线程数,线程池会创建新线程来执行任务。
- 若线程数量达到最大线程数,任务队列也已满,此时会触发饱和策略来处理新任务。
3. 线程池有哪些重要参数?它们的作用分别是什么?
- 回答思路:详细介绍
ThreadPoolExecutor构造函数中的几个重要参数及其作用。 - 回答示例:在 Java 中,
ThreadPoolExecutor是常用的线程池实现类,它的构造函数包含以下重要参数:- corePoolSize(核心线程数):线程池中的核心线程数量,当提交的任务数小于核心线程数时,线程池会创建新线程来执行任务。
- maximumPoolSize(最大线程数):线程池允许创建的最大线程数量,当任务队列已满且线程数量小于最大线程数时,会创建新线程来执行任务。
- keepAliveTime(线程存活时间):当线程池中的线程数量超过核心线程数时,多余的空闲线程在等待新任务的最长时间,超过这个时间,线程将被销毁。
- unit(时间单位):
keepAliveTime的时间单位,如TimeUnit.SECONDS表示秒。 - workQueue(任务队列):用于存储等待执行的任务的队列,常见的有
ArrayBlockingQueue、LinkedBlockingQueue等。 - threadFactory(线程工厂):用于创建线程的工厂,可以自定义线程的名称、优先级等。
- handler(饱和策略):当线程池达到最大线程数且任务队列已满时,处理新任务的策略,常见的有
AbortPolicy(抛出异常)、CallerRunsPolicy(调用者线程执行)、DiscardPolicy(丢弃任务)和DiscardOldestPolicy(丢弃队列中最老的任务)。
4. 如何合理配置线程池的参数?
- 回答思路:根据不同的业务场景,如 CPU 密集型和 IO 密集型任务,说明如何配置核心线程数和其他参数。
- 回答示例:合理配置线程池参数需要考虑任务的类型和系统资源:
- CPU 密集型任务:这类任务主要消耗 CPU 资源,线程池的核心线程数可以设置为 CPU 核心数 + 1,这样可以充分利用 CPU 资源,避免过多的线程切换开销。例如,在一个 4 核的 CPU 上,核心线程数可以设置为 5。
- IO 密集型任务:这类任务主要等待 IO 操作完成,CPU 利用率较低,核心线程数可以设置得较大,一般为 CPU 核心数的 2 倍。例如,在一个 4 核的 CPU 上,核心线程数可以设置为 8。
- 任务队列:根据任务的性质和数量选择合适的任务队列。如果任务量较小且对响应时间要求较高,可以选择有界队列;如果任务量较大且对响应时间要求不高,可以选择无界队列。
- 饱和策略:根据业务需求选择合适的饱和策略。如果任务不允许丢失,可以选择
CallerRunsPolicy;如果允许任务丢失,可以选择DiscardPolicy或DiscardOldestPolicy。
5. 线程池有哪些常见的饱和策略?
- 回答思路:分别介绍几种常见的饱和策略及其特点。
- 回答示例:常见的饱和策略有以下几种:
- AbortPolicy(默认策略):直接抛出
RejectedExecutionException异常,拒绝新任务。这种策略适用于对任务执行要求严格,不允许任务丢失的场景。 - CallerRunsPolicy:让提交任务的线程来执行这个任务。这种策略可以减缓新任务的提交速度,适用于对系统资源使用有一定限制的场景。
- DiscardPolicy:直接丢弃新任务,不会抛出任何异常。这种策略适用于对任务执行不做严格要求,允许任务丢失的场景。
- DiscardOldestPolicy:丢弃任务队列中最老的任务,然后尝试重新提交新任务。这种策略适用于对任务执行顺序要求不高的场景。
- AbortPolicy(默认策略):直接抛出
6. 线程池在使用过程中可能会遇到哪些问题?如何解决?
- 回答思路:列举一些常见问题,如线程泄漏、任务堆积等,并给出相应的解决方法。
- 回答示例:线程池在使用过程中可能会遇到以下问题及解决方法:
- 线程泄漏:如果线程池中的线程在执行任务时抛出异常而没有正确处理,可能会导致线程无法正常关闭,从而造成线程泄漏。解决方法是在任务的
run()方法中捕获所有异常,并进行适当的处理。 - 任务堆积:如果任务提交速度过快,超过了线程池的处理能力,会导致任务队列堆积。可以通过调整线程池的参数,如增加核心线程数、扩大任务队列容量或选择合适的饱和策略来解决。
- 资源耗尽:如果线程池的最大线程数设置过大,可能会导致系统资源耗尽。可以根据系统资源和任务特点合理设置线程池的参数,避免创建过多的线程。
- 线程泄漏:如果线程池中的线程在执行任务时抛出异常而没有正确处理,可能会导致线程无法正常关闭,从而造成线程泄漏。解决方法是在任务的
7. 如何关闭线程池?
- 回答思路:介绍线程池的两种关闭方法及其区别。
- 回答示例:可以使用
shutdown()和shutdownNow()方法来关闭线程池:- shutdown():该方法会平滑地关闭线程池,不再接受新任务,但会等待队列中的任务执行完毕。调用该方法后,线程池的状态会变为
SHUTDOWN。 - shutdownNow():该方法会立即关闭线程池,尝试停止正在执行的任务,并返回队列中未执行的任务列表。调用该方法后,线程池的状态会变为
STOP。
- shutdown():该方法会平滑地关闭线程池,不再接受新任务,但会等待队列中的任务执行完毕。调用该方法后,线程池的状态会变为
希望这篇文章能给您带来帮助!!!
感谢观看!!!
相关文章:
Android第三次面试总结(activity和线程池)
1. Activity 的生命周期方法有哪些?调用顺序是什么? 回答思路:列举 7 个核心方法并说明其触发场景。回答示例: 完整生命周期:onCreate() → onStart() → onResume() → onPause() → onStop() → onDestroy()。可见但…...
突破连接边界!O9201PM Wi-Fi 6 + 蓝牙 5.4 模块重新定义笔记本无线体验
在当今数字化时代,笔记本电脑已成为人们工作、学习和娱乐的必备工具。而无线连接技术,作为笔记本电脑与外界交互的关键桥梁,其性能的优劣直接关乎用户体验的好坏。当下,笔记本电脑无线连接领域存在诸多痛点,严重影响着…...
C语言之 循环语句:程序运行的核心动力(上)
个人主页:strive-debug 在 C 语言中,分支结构可以通过 if、switch 语句来实现,循环结构则可以通过 for、while、do while 语句来实现。 if 语句 if 语句的语法形式如下: if (表达式)语句; 如果表达式成立(为真&am…...
Python----计算机视觉处理(Opencv:图像颜色替换)
一、开运算 开运算就是对图像先进行腐蚀操作, 然后进行膨胀操作。开运算可以去除二值化图中的小的噪点,并分离相连的物体。 其主要目的就是消除那些小白点 在开运算组件中,有一个叫做kernel的参数,指的是核的大小,通常…...
【后端开发面试题】每日 3 题(十三)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:https://blog.csdn.net/newin2020/category_12903849.html 📚专栏简介:在这个专栏中,我将会分享后端开发面试中常见的面试题给大家,每天的题目都是独…...
一周学会Flask3 Python Web开发-SQLAlchemy查询所有数据操作-班级模块
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们来新建一个的蓝图模块-班级模块,后面可以和学生模块,实现一对多的数据库操作。 blueprint下新建g…...
Matlab 风力发电机磁悬浮轴承模型pid控制
1、内容简介 略 Matlab 174-风力发电机磁悬浮轴承模型pid控制 可以交流、咨询、答疑 2、内容说明 磁悬浮轴承具有无接触、无摩擦、高速度、高精度、能耗低、不需要需润滑无油污染、可靠性高、寿命长和密封等一系列显著的优点。将磁悬浮技术应用于风力发电机中可以降低风机切入…...
FPGA中级项目1——IP核(ROM 与 RAM)
FPGA中级项目1——IP核(ROM 与 RAM) IP核简介 在 FPGA(现场可编程门阵列)设计中,IP 核(Intellectual Property Core,知识产权核)是预先设计好的、可重用的电路模块,用于实…...
Elasticsearch 向量检索详解
文章目录 1、向量检索的用途2、适用场景2.1 自然语言处理(NLP):2.2 图像搜索:2.3 推荐系统2.4 音视频搜索 3、向量检索的核心概念3.1 向量3.2 相似度计算3.3 向量索引 4、案例:基于文本的语义搜索5、总结 向量检索是 E…...
Matlab 基于专家pid控制的时滞系统
1、内容简介 Matlab 185-基于专家pid控制的时滞系统 可以交流、咨询、答疑 2、内容说明 略 在处理时滞系统(Time Delay Systems)时,使用传统的PID控制可能会面临挑战,因为时滞会导致系统的不稳定或性能下降。专家PID控制通过结…...
Unity 笔记:在EditorWindow中绘制 Sorting Layer
在Unity开发过程中,可能会对旧资源进行批量修改,一个个手动修改费人费事,所以催生出了一堆批量工具。 分享一下在此过程中绘制 Sorting Layer 面板的代码脚本。 示意图: 在 EditorGUI 和 EditorGUILayer 中内置了 SortingLayerF…...
2024浙江大学计算机考研上机真题
2024浙江大学计算机考研上机真题 2024浙江大学计算机考研复试上机真题 2024浙江大学计算机考研机试真题 2024浙江大学计算机考研复试机试真题 历年浙江大学计算机复试上机真题 历年浙江大学计算机复试机试真题 2024浙江大学计算机复试上机真题 2024浙江大学计算机复试机试真题 …...
蓝桥杯嵌入式赛道复习笔记2(按键控制LED灯,双击按键,单击按键,长按按键)
硬件原理解释 这张图展示了一个简单的按键电路原理图,其中包含四个按键(PB0、PB1、PB2、PB3、PA0),每个按键通过一个10kΩ的上拉电阻连接到VDD(电源电压),并接地(GND)。 …...
每天五分钟深度学习PyTorch:循环神经网络RNN的计算以及维度信息
本文重点 前面我们学习了RNN从何而来,以及它的一些优点,我们也知道了它的模型的大概情况,本文我们将学习它的计算,我们来看一下RNN模型的每一个时间步在计算什么? RNN的计算 ht-1是上一时刻的输出,xt是本时刻的输入,然后二者共同计算得到了ht,然后yt通过ht计算得到,…...
Ubuntu docker安装milvusdb
一、安装docker 1.更新软件包 sudo apt update sudo apt upgrade sudo apt-get install docker-ce docker-ce-cli containerd.io查看是否安装成功 docker -v二、使用国内的镜像下载 milvusdb Docker中国区官方镜像: https://registry.docker-cn.com milvusdb/milvus - Doc…...
【优选算法篇】--深度解析之滑动窗口篇
滑动窗口 一、长度最小的子数组二、无重复字符的最长子串三、最大连续1的个数III四、水果成篮 一、长度最小的子数组 长度最小的子数组 解析: 首先看到这题 我们首先想到的是暴力枚举,就是暴力枚举所有子数组和。时间复杂度是O(n^3)。 我们这里用解法…...
[STM32]新建工程||一个工程文件应该有哪些基本内容?
目录 一 、开发方法 1.直接使用程序来配置寄存器 2.基于库函数的方式 3.基于HAL库的方式 二 、常规的工程文件分类 STM32芯片型号分类以及缩写 三 步骤总结 四 工程架构 五 调用外设基本通用步骤 一 、开发方法 1.直接使用程序来配置寄存器 底层,直接&…...
Unity利用噪声生成动态地形
引言 在游戏开发中,地形是构建游戏世界的基础元素之一。传统的地形创建方法通常依赖于手动建模或预设资源,这种方式虽然精确但缺乏灵活性,且工作量巨大。而使用噪声算法生成地形则提供了一种程序化、动态且高效的解决方案。本文将详细介绍如…...
浅谈StarRocks SQL性能检查与调优
StarRocks性能受数据建模、查询设计及资源配置核心影响。分桶键选择直接决定数据分布与Shuffle效率,物化视图可预计算复杂逻辑。执行计划需关注分区裁剪、谓词下推及Join策略,避免全表扫描或数据倾斜。资源层面,需平衡并行度、内存限制与网络…...
java 中散列表(Hash Table)和散列集(Hash Set)是基于哈希算法实现的两种不同的数据结构
在 Java 中,散列表(Hash Table)和散列集(Hash Set)是两种不同的数据结构,但它们都基于哈希表的原理来实现。下面是它们的联系与区别、实现类以及各自的优缺点,并用表格进行对比整理。 联系与区…...
python编写的一个打砖块小游戏
游戏介绍 打砖块是一款经典的街机游戏,玩家控制底部的挡板,使球反弹以击碎上方的砖块。当球击中砖块时,砖块消失,球反弹;若球碰到挡板,则改变方向继续运动;若球掉出屏幕底部,玩家失…...
【菜鸟飞】通过vsCode用python访问公网deepseek-r1等模型(Tocken模式)
目标 通过vsCode用python访问deepseek。 环境准备 没有环境的,vscode环境准备请参考之前的文章,另外需安装ollama: 【菜鸟飞】用vsCode搭建python运行环境-CSDN博客 AI入门1:AI模型管家婆ollama的安装和使用-CSDN博客 选读文章…...
Figma介绍(基于云的协作式界面设计工具,主要用于UI/UX设计、原型制作和团队协作)
文章目录 注册和登录简单操作说明Figma介绍**核心特点**1. **云端协作与实时同步**2. **跨平台兼容**3. **高效设计工具**4. **原型交互与动效**5. **开发对接友好**6. **插件生态**7. **版本控制与历史记录** **适用场景**- **团队协作**:远程团队共同设计、评审、…...
Text-to-SQL将自然语言转换为数据库查询语句
有关Text-To-SQL方法,可以查阅我的另一篇文章,Text-to-SQL方法研究 直接与数据库对话-text2sql Text2sql就是把文本转换为sql语言,这段时间公司有这方面的需求,调研了一下市面上text2sql的方法,比如阿里的Chat2DB,麻…...
什么是 Fisher 信息矩阵
什么是 Fisher 信息矩阵 Fisher 信息矩阵是统计学和机器学习中一个重要的概念,它用于衡量样本数据所包含的关于模型参数的信息量。 伯努利分布示例 问题描述 假设我们有一个服从伯努利分布的随机变量 X X X,其概率质量函数为 P ( X ...
XSS漏洞靶场---(复现)
XSS漏洞靶场—(复现) 反射型 XSS 的特点是攻击者诱导用户点击包含恶意脚本的 URL,服务器接收到请求后将恶意脚本反射回响应页面,浏览器执行该脚本从而造成攻击,恶意脚本不会在服务器端存储。 Level 1(反射型XSS) 此漏…...
基于ssm的电子病历系统(全套)
一、系统架构 前端:jsp | bootstrap | jquery 后端:spring | springmvc | mybatis 环境:jdk1.8 | mysql | maven | tomcat | idea 二、代码及数据库 三、功能介绍 01. 登录 02. 主页 03. 管理员-个人中心-修改密码…...
Linux-数据结构-线性表-单链表
一.链表的概念 【1】线性表的链式存储 解决顺序存储的缺点,插入和删除,动态存储问题。 【2】特点: 线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。可以被存…...
基于SpringBoot的Mybatis和纯MyBatis项目搭建的区别
【由于之前学习MyBatis的时候是跟着视频敲的纯MyBatis项目,以至于在突然看到别人在SpringBoot项目里搭建MyBatis方式的时候很懵比…特此文字形式记录一下区别(应该还有好多种其他方式是我不知道的,主要应该就是要知道关键的流程步骤ÿ…...
通过 Python 爬虫提高股票选股胜率
此贴为Python爬虫技术学习贴 在股票中,即便有了选股规则,从5000多只股票中筛选出符合规则的股票也是十分困难的,于是想通过爬虫来实现自动化的快速选股。全文用GP代替股票 实现方案 1、指定两套规则,第一套弱约束,第…...
