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()(保持部分可见)。
    • 目标 ActivityonCreate() → onStart() → onResume()

3. 按下 Back 键返回时,生命周期如何变化?

  • 回答思路:描述返回栈的弹出过程。
  • 回答示例
    • 目标 ActivityonPause() → onStop() → onDestroy()(被销毁)。
    • 原 ActivityonRestart() → onStart() → onResume()(恢复前台)。

4. 屏幕旋转时,Activity 的生命周期会发生什么变化?如何避免重启?

  • 回答思路:解释配置变更的默认行为及解决方案。
  • 回答示例
    • 默认行为:Activity 被销毁并重建,调用onPause() → onStop() → onDestroy() → onCreate() → onStart() → onResume()
    • 避免重启
      1. 在 AndroidManifest.xml 中设置:
<activity android:name=".MainActivity"android:configChanges="orientation|screenSize" />

 通过onSaveInstanceState()保存临时状态,onRestoreInstanceState()恢复。

5. 当 Activity 被系统回收后重新打开,生命周期如何变化?

  • 回答思路:说明低内存场景下的回收机制。
  • 回答示例
    • 回收时:Activity 可能仅执行onPause() → onStop()(未执行onDestroy())。
    • 重新打开:调用onCreate() → onStart() → onResume(),需通过onSaveInstanceState()恢复数据。

6. Activity 进入后台再回到前台时,生命周期如何变化?

  • 回答思路:区分短暂离开和长期后台。
  • 回答示例
    • 短暂离开(如按 Home 键)
      • 后台:onPause() → onStop()
      • 返回前台:onRestart() → onStart() → onResume()
    • 长期后台(系统回收):需重新创建 Activity 实例。

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()

下列是线程池相关面试题:

1.什么是线程池?为什么要使用线程池?

  • 回答思路:先给出线程池的定义,再阐述使用线程池的好处。
  • 回答示例:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建的线程集合中启动这些任务。使用线程池主要有以下好处:
    • 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
    • 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。
    • 提高线程的可管理性:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。

2. 线程池的工作原理是什么?

  • 回答思路:按照任务提交的顺序,依次说明线程池如何处理任务,包括核心线程、任务队列和最大线程数的关系。
  • 回答示例:当向线程池提交一个任务时,线程池的处理流程如下:
    • 若线程池中的线程数量少于核心线程数,线程池会立即创建一个新线程来执行该任务。
    • 若线程数量达到核心线程数,新任务会被放入任务队列中等待执行。
    • 若任务队列已满,且线程数量小于最大线程数,线程池会创建新线程来执行任务。
    • 若线程数量达到最大线程数,任务队列也已满,此时会触发饱和策略来处理新任务。

3. 线程池有哪些重要参数?它们的作用分别是什么?

  • 回答思路:详细介绍 ThreadPoolExecutor 构造函数中的几个重要参数及其作用。
  • 回答示例:在 Java 中,ThreadPoolExecutor 是常用的线程池实现类,它的构造函数包含以下重要参数:
    • corePoolSize(核心线程数):线程池中的核心线程数量,当提交的任务数小于核心线程数时,线程池会创建新线程来执行任务。
    • maximumPoolSize(最大线程数):线程池允许创建的最大线程数量,当任务队列已满且线程数量小于最大线程数时,会创建新线程来执行任务。
    • keepAliveTime(线程存活时间):当线程池中的线程数量超过核心线程数时,多余的空闲线程在等待新任务的最长时间,超过这个时间,线程将被销毁。
    • unit(时间单位)keepAliveTime 的时间单位,如 TimeUnit.SECONDS 表示秒。
    • workQueue(任务队列):用于存储等待执行的任务的队列,常见的有 ArrayBlockingQueueLinkedBlockingQueue 等。
    • 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:丢弃任务队列中最老的任务,然后尝试重新提交新任务。这种策略适用于对任务执行顺序要求不高的场景。

6. 线程池在使用过程中可能会遇到哪些问题?如何解决?

  • 回答思路:列举一些常见问题,如线程泄漏、任务堆积等,并给出相应的解决方法。
  • 回答示例:线程池在使用过程中可能会遇到以下问题及解决方法:
    • 线程泄漏:如果线程池中的线程在执行任务时抛出异常而没有正确处理,可能会导致线程无法正常关闭,从而造成线程泄漏。解决方法是在任务的 run() 方法中捕获所有异常,并进行适当的处理。
    • 任务堆积:如果任务提交速度过快,超过了线程池的处理能力,会导致任务队列堆积。可以通过调整线程池的参数,如增加核心线程数、扩大任务队列容量或选择合适的饱和策略来解决。
    • 资源耗尽:如果线程池的最大线程数设置过大,可能会导致系统资源耗尽。可以根据系统资源和任务特点合理设置线程池的参数,避免创建过多的线程。

7. 如何关闭线程池?

  • 回答思路:介绍线程池的两种关闭方法及其区别。
  • 回答示例:可以使用 shutdown() 和 shutdownNow() 方法来关闭线程池:
    • shutdown():该方法会平滑地关闭线程池,不再接受新任务,但会等待队列中的任务执行完毕。调用该方法后,线程池的状态会变为 SHUTDOWN
    • shutdownNow():该方法会立即关闭线程池,尝试停止正在执行的任务,并返回队列中未执行的任务列表。调用该方法后,线程池的状态会变为 STOP

希望这篇文章能给您带来帮助!!!

感谢观看!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35373.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20250317笔记本电脑在ubuntu22.04下使用acpi命令查看电池电量

20250317笔记本电脑在ubuntu22.04下使用acpi命令查看电池电量 2025/3/17 18:05 百度&#xff1a;ubuntu查看电池电量 百度为您找到以下结果 ubuntu查看电池电量 在Ubuntu操作系统中&#xff0c;查看电池电量通常可以通过命令行或者图形界面来完成。下面是一些常见的方法&…

openEuler系统迁移 Docker 数据目录到 /home,解决Docker 临时文件占用大问题

根据错误信息 write /var/lib/docker/tmp/...: no space left on device&#xff0c;问题的根源是 根分区&#xff08;/&#xff09;的磁盘空间不足&#xff0c;而非 /home 分区的问题。以下是详细解释和解决方案&#xff1a; 问题原因分析 Docker 临时文件占用根分区空间&…

Java 大视界 -- Java 大数据在智能政务舆情引导与公共危机管理中的应用(138)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

Deepseek API+Python测试用例一键生成与导出-V1.0.2【实现需求文档图片识别与用例生成自动化】

在测试工作中&#xff0c;需求文档中的图片&#xff08;如界面设计图、流程图&#xff09;往往是测试用例生成的重要参考。然而&#xff0c;手动提取图片并识别内容不仅耗时&#xff0c;还容易出错。本文将通过一个自研小工具&#xff0c;结合 PaddleOCR 和大模型&#xff0c;自…

搭建opensbi+kernel+rootfs及基本设备驱动开发流程

目录 一.编译qemu 运行opensbikernelrootfs 1.编译qemu-9.1.1 2.安装riscv64编译器 3. 编译opensbi 4.编译kernel 5.编译rootfs 设备驱动开发流程 1.安装 RISC-V 交叉编译工具链 2.驱动开发准备 3.编写简易中断控制器驱动&#xff08;PLIC&#xff09;​ 4.配置内核…

16.使用读写包操作Excel文件:XlsxWriter 包

一 XlsxWriter 的介绍 XlsxWriter 只能写入 Excel 文件。 OpenPyXL 和 XlsxWriter 的区别在笔记 15 。 二 如何使用 XlsxWriter 1.导包 import datetime as dtimport xlsxwriterimport excel 2.实例化工作簿 book xlsxwriter.Workbook("xlxswriter.xlsx") book.clo…

LeetCode 124.二叉树中的最大路径和

题目&#xff1a; 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点…

【Dubbo+Zookeeper】——SpringBoot+Dubbo+Zookeeper知识整合

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

MCP 开放协议

本文翻译整理自&#xff1a; https://modelcontextprotocol.io/introduction 文章目录 简介一、关于 MCP二、为什么选择MCP&#xff1f;通用架构 三、开始使用1、快速入门2、示例 四、教程五、探索 MCP六、贡献和支持反馈贡献支持和反馈 服务器开发者一、构建服务器1、我们将要…

方差,协方差及协方差矩阵的计算

1.方差 方差是用来衡量一组数据的离散程度&#xff0c;数序表达式如下: σ 2 1 N ∑ i 1 N ( x i − μ ) 2 \sigma^2\frac1N\sum_{i1}^N(x_i-\mu)^2 σ2N1​i1∑N​(xi​−μ)2 σ 2 σ^2 σ2表示样本的总体方差&#xff0c; N N N 表示样本总数&#xff0c; x i x _i xi​…

【2025】基于python+django的慢性病健康管理系统(源码、万字文档、图文修改、调试答疑)

系统功能结构图如下 慢性病健康管理系统 课题背景 随着全球人口老龄化的加剧以及生活方式的改变&#xff0c;慢性病的发病率呈上升趋势&#xff0c;给个人健康和社会医疗资源带来了巨大压力。传统的慢性病管理模式存在信息不畅、患者参与度低、医疗资源分配不均等问题&#xf…

2.2 B/S架构和Tomcat服务器

本文介绍了B/S架构、Tomcat服务器及其与IDEA的整合。B/S架构是一种基于浏览器的网络计算模式&#xff0c;具有跨平台、易用性强的特点&#xff0c;适用于互联网应用。Tomcat是Apache开源的Web服务器&#xff0c;支持Java Web应用的部署和运行。文章通过实例演示了如何下载、安装…

QT非UI设计器生成界面的国际化

目的 UI设计器生成界面的国际化&#xff0c;比较容易实现些&#xff0c;因为有现成的函数可以调用&#xff0c;基本过程如下&#xff1a; void MainWindow::on_actLang_CN_triggered() {//中文界面qApp->removeTranslator(trans);delete trans;transnew QTranslator;trans…

Hackme靶机通关攻略

1&#xff0c;打开靶机和kali&#xff0c;在kali终端中扫描靶机ip,得到靶机ip为192.168.50.137 arp-scan -l 2&#xff0c;使用工具扫描出后台目录后访问login.php 3&#xff0c;注册后登陆发现有输入框&#xff0c;可以尝试使用sql注入来得到用户名和密码&#xff0c;密码需要…

国产编辑器EverEdit - 工具栏自定义及认识工具栏上的按钮

1 设置-高级-工具条 1.1 设置说明 1.1.1 工具条自定义 选择主菜单工具 -> 设置 -> 常规&#xff0c;在弹出的选项窗口中选择工具条分类&#xff0c;如下图所示&#xff1a; 左侧窗口是当前支持所有功能按钮列表(上图中居中栏)&#xff0c;右侧的窗口是当前显示在工具栏…

docker安装rabbitmq

第一步直接dokce拉取rabbitmq镜像docker 利用docker直接拉取镜像最新版&#xff1a;docker search rabbitmq 运行mq&#xff1a; 需要注意的是-p 5673:5672 解释&#xff1a;-p 外网端口&#xff1a;docker的内部端口 &#xff0c;你们可以改成自己的外网端口号&#xff0c;我这…

【实战ES】实战 Elasticsearch:快速上手与深度实践-8.2.2成本优化与冷热数据分离

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 8.2.2AWS OpenSearch Serverless 成本优化与冷热数据分离深度实践1. 成本构成分析与优化机会识别1.1 Serverless模式成本分布1.2 冷热数据特征分析数据特征矩阵 2. 冷热数据…

安卓edge://inspect 和 chrome://inspect调试移动设备上的网页

edge://inspect 和 chrome://inspect 是用于调试浏览器中运行的网页和移动设备上的网页的工具。这两个工具分别属于 Microsoft Edge 和 Google Chrome 浏览器。以下是它们的详细介绍&#xff1a; chrome://inspect 如果是直接使用数据线调试&#xff0c;则只需要执行下面的第一…

checkpoint机制

1、什么是checkpoint 将缓冲池中的脏页刷新到磁盘&#xff0c;并更新redo log的checkpoint位点&#xff0c;确保数据库在发生故障时可以快速恢复到一致的状态。 2、checkpoint执行过程 确保需要刷新的脏页&#xff1a;从缓冲池中选取一部分需要刷新的页数据页刷新&#xff1…

【微服务日志收集①】使用FileBeat+Logstash+ES搭建ELK日志系统

使用FileBeatLogstashES搭建ELK日志系统&#xff0c;架构图如下&#xff1a; 1、 使用docker快速创建ES服务和Kibana服务 前置条件&#xff1a;需要在linux上提前安装好docker和docker-compose 1.1、在linux创建好一个用于存放docker-compose配置文件的文件夹 我的目录是/app/…