安卓面试问题记录

目录

  • 1. JNI和NDK
    • 1.谈谈你对JNI和NDK的理解
    • 2.简要的JNI调用过程:
  • 2. 线程、同步、异步
    • 1.Java创建线程的方式有几种?start()方法和 run()方法的区别
    • 2.Handler 机制和原理
    • 3.为什么在子线程中创建Handler会抛异常?
    • 4.Android中的ANR的解决方法
    • 5.intentservice有什么优点?
    • 6.okhttp异步请求流程
    • 7.Okhttp的同步请求
  • 3. UI
    • 1.谈谈你对 Bitmap 的理解,什么时候应该手动调用 bitmaprecycle():
    • 2.Android布局的五个常见类型:
  • 4. 组件
    • **1.Android四大组件是指Activity、Service、BroadcastReceiver和ContentProvider**。
  • 5. 四大组件详解
      • 1. **activity**
      • **2 .service**
      • **3 .content provider**
      • **4 .broadcast receiver**
    • 如果后台的activity由于某种原因被系统回收了,如何在被系统回收之前保存当前状态?
  • 6. 机制
    • 1.view的事件分发机制
  • 7. 性能
    • 1.GC是什么,为什么要有GC
  • 8. 数据库
    • 1.SQLite 数据库升级——新增字段处理

1. JNI和NDK

1.谈谈你对JNI和NDK的理解

答:JNI(Java Native Interface)是Java提供的一种机制,用于实现Java与其他编程语言(如C、C++)之间的交互。它允许Java代码调用本地代码(Native Code)并与其进行数据交换。
NDK(Native Development Kit)是Android提供的一个工具集,用于在Android应用中使用本地代码。它包含了一系列的工具和库,可以将C、C++代码编译成与特定平台相关的本地库文件(例如.so文件),然后通过JNI将这些本地库文件嵌入到Android应用中。
JNI和NDK的关系是,JNI提供了Java与本地代码交互的机制,而NDK则提供了将本地代码集成到Android应用中的工具和库。通过JNI和NDK,开发者可以在Android应用中使用C、C++等本地语言编写高性能、底层的功能模块,比如图像处理、音频处理、加密算法等。
使用JNI和NDK可以带来以下优势:
1.性能优化:某些计算密集型任务,使用本地代码可以提高执行效率。
2.跨平台开发:通过使用本地代码,可以在不同平台上共享代码和库。
3.重用现有代码:如果已经有了C、C++等语言的现有代码,可以通过JNI和NDK将其集成到Android应用中,避免重复开发。
需要注意的是,在使用JNI和NDK时,需要谨慎处理内存管理、类型转换和异常处理等问题,以确保代码的正确性和稳定性。

2.简要的JNI调用过程:

1、**编写本地代码:**首先,需要编写包含所需功能的本地代码,通常是用C或C++编写。这些本地代码将被编译成共享库(.so文件)。
2、创建JNI接口:在Java代码中,需要声明与本地代码对应的JNI接口。这些接口方法将与本地代码中的函数进行绑定,以便在Java中调用。
3、生成头文件:使用Java Development Kit(JDK)中的工具javah,生成包含JNI接口方法定义的头文件。
4、实现JNI接口:在本地代码中,需要实现JNI接口中声明的方法。这些方法将提供与Java代码之间的桥梁,使得Java可以调用本地代码。
5、编译本地代码:使用C/C++编译器将本地代码编译成共享库(.so文件)。
6、将共享库加载到应用程序:在Android应用程序中,可以使用System.loadLibrary()方法加载共享库。
7、调用JNI方法:在Java代码中,通过调用JNI接口中声明的方法来调用本地代码。可以使用native关键字标记这些方法。
8、运行应用程序:在应用程序运行时,当Java代码调用JNI方法时,将触发与本地代码的交互,完成相应的功能操作。
需要注意的是,JNI调用涉及到本地代码的编写和编译,因此需要对C/C++有一定的了解。此外,在JNI调用过程中,需要注意内存管理和数据类型转换等问题,以确保安全性和正确性。
JNI调用过程包括编写本地代码、创建JNI接口、生成头文件、实现JNI接口、编译本地代码、加载共享库、调用JNI方法等步骤,通过这些步骤可以实现Java代码与本地代码之间的交互

2. 线程、同步、异步

1.Java创建线程的方式有几种?start()方法和 run()方法的区别

答:在Java中,有两种主要的方式可以创建线程
1.继承Thread类:通过继承Thread类并重写其run()方法来创建线程。首先,创建一个继承自Thread的子类,并在子类中实现run()方法来定义线程的具体逻辑。然后,通过创建子类的实例对象,并调用其start()方法来启动线程。
2.实现Runnable接口:通过实现Runnable接口来创建线程。首先,创建一个实现了Runnable接口的类,并在该类中实现run()方法。然后,创建Thread类的实例对象,将实现了Runnable接口的类的实例作为参数传递给Thread的构造函数。最后,调用Thread对象的start()方法来启动线程。

区别

  • 使用继承Thread类的方式,线程的逻辑直接写在子类中的run()方法中,但这样会限制了子类的继承关系。
  • 使用实现Runnable接口的方式,线程的逻辑在实现了Runnable接口的类中定义,可以更灵活地共享代码和资源,并且避免了单继承的限制。

关于start()方法和run()方法的区别

  • start()方法用于启动线程并异步执行线程的逻辑。调用start()方法后,系统会为线程分配资源并调用线程的run()方法。
  • run()方法是线程的入口点,可以将线程的具体逻辑在run()方法中实现。但直接调用run()方法并不会启动新的线程,而是在当前线程中同步执行run()方法的代码块。

总结来说,Java创建线程的方式有继承Thread类和实现Runnable接口。start()方法用于启动线程并异步执行线程的逻辑,而run()方法是线程的入口点,在调用start()方法后由系统自动调用

2.Handler 机制和原理

Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。

基础概念

  • UI线程
    主线程 ActivityThread ,主线程也是Ui线程,应用启动的时候会启动一个ui线程
  • Handler
    负责发送消息和处理消息。
  • Looper
    负责消息循环,循环取出 MessageQueue 里面的 Message,并交给相应的 Handler 进行处理。
  • MessageQueue
    消息队列,用来存放通过Hangdler 发送的消息,按照先进先出的顺序取出消息,内部使用的是单链表结构(

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

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

相关文章

QEMU源码全解析17 —— QOM介绍(6)

接前一篇文章:QEMU源码全解析16 —— QOM介绍(5) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 上一回讲解了Q…

【通讯录】--C语言

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

路由策略(重发布)

要求&#xff1a; 1、使用双点双向重发布 2、所有路由器进行最佳选路 3、存在备份路径&#xff0c;不得出现环路&#xff0c;和路由回馈 1.更改设备名称配置接口IP地址 R1 <Huawei>system-view [Huawei]sysname R1 [R1]interface GigabitEthernet 0/0/0 [R1-GigabitEt…

Linux和Mac环境下的Nginx安装教程

Linux安装 登录root账号&#xff0c;服务器环境为阿里云的Cent OS 7.6版本 执行yum install yum-utils 运行vim /etc/yum.repos.d/nginx.repo 输入&#xff1a; [nginx-stable]namenginx stable repobaseurlhttp://nginx.org/packages/centos/7/$basearch/gpgcheck1enable…

ChatGPT在语义理解和信息提取中的应用如何?

ChatGPT在语义理解和信息提取领域有着广泛的应用潜力。语义理解是指对文本进行深层次的理解&#xff0c;包括词义、句义和篇章义等层面的理解。信息提取是指从文本中自动抽取结构化的信息&#xff0c;如实体、关系、事件等。ChatGPT作为一种预训练语言模型&#xff0c;具有丰富…

Python深度学习“四大名著”之一【赠书活动|第二期《Python机器学习:基于PyTorch和Scikit-Learn》】

近年来&#xff0c;机器学习方法凭借其理解海量数据和自主决策的能力&#xff0c;已在医疗保健、 机器人、生物学、物理学、大众消费和互联网服务等行业得到了广泛的应用。自从AlexNet模型在2012年ImageNet大赛被提出以来&#xff0c;机器学习和深度学习迅猛发展&#xff0c;取…

MATLAB与ROS联合仿真(慕羽☆)全套开源资料索引

自2021年9月份开始进行MATLAB与ROS联合仿真相关的研究&#xff0c;至2021年12月份研究基本上结束&#xff0c;至今&#xff0c;已经近两年时间&#xff0c;期间曾收到过很多小伙伴的私信&#xff0c;想让我出点教程&#xff0c;期间我也曾多次想要抽点时间出教程&#xff0c;但…

112、SpringBoot中配置文件的加载顺序是怎样的?

SpringBoot中配置文件的加载顺序是怎样的&#xff1f; 优先级从高到低&#xff0c;高优先级的配置覆盖低优先级的配置&#xff0c;所有配置会形成互补配置。 命令行参数。所有的配置都可以在命令行上进行指定Java系统属性(System.getProperties());操作系统环境变量;jar包外部…

JMeter 怎么查看 TPS 数据教程,简单易懂

TPS 是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时&#xff0c;收到服务器响应后结束计时&#xff0c;以此来计算使用的时间和完成的事务个数。在 JMeter 中&#xff0c;我们可以使用以下方法查看 T…

华为战略方法论:BLM模型之关键任务与依赖关系

内容简介 在 BLM 模型中&#xff0c;执行部分包括四个模块&#xff0c;分别是&#xff1a; 关键任务与依赖关系&#xff1b;组织与绩效&#xff1b;人才&#xff1b;氛围与文化。 详细内容&#xff0c;大家可以参看下面这张图。 这四个模块其实是可以进一步划分成两个关键点…

MFC自定义控件使用

用VS2005新建一个MFC项目,添加一个Custom Control控件在窗体 我们需要为自定义控件添加一个类。项目,添加类,MFC类 设置类名字,基类为CWnd,你也可以选择CDialog作为基类 类创建完成后,在它的构造函数中注册一个新的自定义窗体,取名为"MyWindowClass" WNDCL…

8.11 PowerBI系列之DAX函数专题-TopN中实现N的动态

需求 实现 1 ranking by amount rankx(allselected(order_2[产品名称]),[total amount]) 2 rowshowing_boolean var v_ranking [ranking by amount] var v_topN-no [topN参数 值] var v_result int( v_ranking < v_topN_no) return v_result 3 将度量值2放入视觉对象筛…

大数据Flink(五十二):Flink中的批和流以及性能比较

文章目录 Flink中的批和流以及性能比较 ​​​​​​​​​​​​​​一、Flink中的批和流

【网络云盘客户端】——上传文件的功能的实现

目录 上传文件功能的实现 uploadtask的设计 设置上传的槽函数 uploadFileAction接口 uploadFile接口 定时上传文件 进度条的设计 上传文件功能的实现 上传文件功能实现 1.双击 ”上传文件 “的 QListWidgetItem 或者 点击 “上传” 菜单项 都会弹出一个文件对话框 2.在文…

华为云安装MySQL后,本地工具连接MySQL失败

华为云安装MySQL后&#xff0c;本地连接失败 排查问题步骤&#xff1a; 在此之前需要在MySQL创建用户&#xff0c;并赋予权限。 1、能否ping通。 在本地命令行(Windows&#xff1a;winR)通过ping命令&#xff0c;ping服务器地址&#xff0c;看能否ping通。不能则需要检查本地…

【C++入门】浅谈类、对象和 this 指针

文章目录 一、前言二、类1. 基本概念2. 类的封装3. 使用习惯成员函数定义习惯成员变量命名习惯 三、对象1. 基本概念2. 类对象的存储规则 四、this 指针1. 基本概念2. 注意事项3. 经典习题4. 常见面试题 一、前言 在 C 语言中&#xff0c;我们用结构体来描述一个事物的多种属性…

ubuntu docker离线安装docker(.deb包方式)(成功)(附卸载方法)

参考文章&#xff1a;Install Docker Engine on Ubuntu 文章目录 安装步骤下载安装包拷贝到目标主机并执行安装命令 验证拉取运行容器测试build dockerfile测试持久运行容器测试主机重启后&#xff0c;docker各服务是否正常自启 卸载方法附&#xff1a;各安装包作用说明&#x…

C++的类型转换运算符:static_cast

C的类型转换运算符&#xff1a;static_cast static_cast 用于在相关类型的指针之间进行转换&#xff0c;还可显式地执行标准数据类型的类型转换—这种转换原本将自动或隐式地进行。用于指针时&#xff0c; static_cast 实现了基本的编译阶段检查&#xff0c;确保指针被转换为相…

express编写一个简单的get接口

/01编写get接口.jsconst express require(express) const app express()// 创建路由 const useRouter require(./router/user.js) // 注册路由 app.use(/api,useRouter)app.listen(8080, (req, res) > {console.log(8080监听) }) ./02编写post接口 // 注意&#xff1a;如…

mac cli文件管理器

背景 最近研究了一下在控制台查看文件的插件ranger, 官方的解释是&#xff1a;一个cli下的文件管理器。觉得效果也很酷炫&#xff0c;所以在此展示一下。 安装 brew install ranger配置生成 建议第一次使用的时候使用 ranger --copy-configall将会在~/.config/ranger目录输…