Android 大疆面经

Android 大疆面经

文章目录

  • Android 大疆面经
    • 一面

一面

  1. 自我介绍
  2. 问项目聊了10分钟
  3. View的绘制流程
  4. MVC,MVP,MVVM的区别
  5. view和viewmodel的通信,除了databing还有其他的方式
  6. 面向对象和面向过程的区别
  7. 工厂模式和策略模式,哪些框架使用了策略模式
  8. 广播的本地广播和全局广播区别
    1. 可以明确地知道正在发送的广播不会离开我们的程序,因此不需要担心机密数据泄露的问题。
    2. 其他的程序无法将广播发送到我们的程序内部,因此不需要担心会有安全漏洞的隐患。
    3. 发送本地广播比起发送系统全局广播将会更加高效。
  9. 事件分发机制
  10. 滑动冲突拦截
    1. 外部拦截法
      1. 直接在父容器中拦截吧 的滑动事件,让其不能进入子元素中
      2. 就是在我们接受<font style="color:#F5222D;">ACTION_MOVE</font>事件的时候直接通过<font style="color:#F5222D;"> onInterceptTouchEvent</font> 方法返回<font style="color:#FA541C;">ture</font> 直接拦截掉这个事件
      3. 伪代码:
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {ev?.run { if (action == MotionEvent.ACTION_MOVE && 父容器需要点击事件){return true}}return super.onInterceptTouchEvent(ev)
    4. 不能拦截 `<font style="color:#F5222D;">ACTION_DOWN</font>` 和 `<font style="color:#F5222D;">ACTION_UP</font>`,如果拦截了 `<font style="color:#F5222D;">ACTION_DOWN</font>` 事件,那后续的 `<font style="color:#F5222D;">ACTION_MOVE</font>`<font style="color:#F5222D;">、</font>`<font style="color:#F5222D;">ACTION_UP </font>`等其它事件均不会在调用 `<font style="color:#F5222D;">onInterceptTouchEvent()</font>` 方法,会直接交给当前容器处理。而如果我们拦截掉 `<font style="color:#F5222D;">ACTION_UP</font> `的话,肯定会导致子元素的点击事件无法被处理,一个点击事件从 `<font style="color:#F5222D;">ACTION_DOWN</font>` 开始,从 `<font style="color:#F5222D;">ACTION_UP</font>` 结束,二者缺一不可。
2. **内部拦截法**1. 这个很明显就是在子view里面做事件判断和拦截,这里我们直接重写子元素的`<font style="color:#F5222D;">dispatchTouchEvent()</font>`方法,在这个方法里面判断是不是需要父View去拦截。
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {ev?.run { when(action){MotionEvent.ACTION_DOWN -> parent.requestDisallowInterceptTouchEvent(true)MotionEvent.ACTION_MOVE ->{if(满足需要让外部容器拦截事件){parent.requestDisallowInterceptTouchEvent(false)}}}}return super.dispatchTouchEvent(ev)
}
    2. <font style="color:rgb(51, 51, 51);">我们给父容器的 </font>`<font style="color:rgb(255, 80, 44);background-color:rgb(255, 245, 245);">requestDisallowInterceptTouchEvent()</font><font style="color:rgb(51, 51, 51);"> </font>`<font style="color:rgb(51, 51, 51);">传递的参数代表是否不允许其拦截事件,当参数为 </font>`<font style="color:rgb(255, 80, 44);background-color:rgb(255, 245, 245);">true</font><font style="color:rgb(51, 51, 51);"> </font>`<font style="color:rgb(51, 51, 51);">的时候代表不允许拦截,为 </font>`<font style="color:rgb(255, 80, 44);background-color:rgb(255, 245, 245);">false</font><font style="color:rgb(51, 51, 51);"> </font>`<font style="color:rgb(51, 51, 51);">的时候代表拦截。</font>3. <font style="color:rgb(51, 51, 51);">我们得在父view里面重写他的</font>`<font style="color:#F5222D;">onInterceptTouchEvent</font>`<font style="color:#F5222D;"> </font>,不允许他拦截`<font style="color:#F5222D;">ACTION_DOWN</font>`<font style="color:#F5222D;"> ,</font>否认任何事件都无法再传递到子元素中
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {ev?.run { if (action == MotionEvent.ACTION_DOWN){return false}}return super.onInterceptTouchEvent(ev)
}
  1. Android动画有咩有用过,属性动画
  2. Android进程通信
    • **使用Bundle **,由于bundle实现了Parcelable接口,可以在不同进程间传输。
    • **使用文件共享,**两个进程通过读一个文件来交换数据,Android是基于Linux,可以并发读写,并发读的话可能导致读出的数据不是最新的,并发写的话会把问题写错。文件共享适用于对数据同步要求不高的进程通信。多进程下不建议使用sharedpreferences,会有很大概率丢失数据,sharedpreferences是在一个个进程会有自己的缓存。
    • **使用Messenger,是一种轻量级的IPC方案,底层是AIDL **,服务端需要创建一个Service,创建一个handler,并通过他来创建一个Messenger对象,然后在Service的OnBind的方法返回,客户端需要绑定Service,绑定成功后使用服务端返回的IBinder创建一个Messenger,这样客户端就可以和服务端发送消息了,消息类型是Messenger,如果希望服务端也能发送消息给客户端,在客户端创建一个handler用来处理服务端发送的消息,使用这个handler创建一个Messenger,将Messenger通过replyTo返回给服务器,服务器拿到客户端的Messenger就可以进行通信了。
    • **使用AIDL,**服务端创建一个Service用来监听客户端的请求连接,创建一个AIDL文件,将暴露给客户端的接口在这个文件中声明,最后在Service中,声明实现AIDL的接口,客户端绑定服务端的Service,将服务端成功返回的Binder对象转为AIDL接口所属于的类型,接着可以调用AIDL的方法
    • **ContentProvider,**可以理解为受约束的AIDL,主要提供数据源的CRUD
    • **Socket,**服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了
    • Broadcast <font style="color:#F5222D;">sendBroadcast()</font> 方法里面<font style="color:#F5222D;">Intent</font>可以携带<font style="color:#F5222D;">Bundle</font>数据进行跨进程通信
  3. Android线程通信
    • Handler
    • runOnUIThread
    • AsyncTask
    • View.post
    • ThreadLocal
  4. Java进程通信
    1. **管道/匿名管道(Pipes) **:用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。
    2. **有名管道(Names Pipes) **: 匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循先进先出(first in first out)。有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。
    3. 信号(Signal) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;
    4. 消息队列(Message Queuing) :消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。管道和消息队列的通信数据都是先进先出的原则。与管道(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显式地删除一个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比 FIFO 更有优势。消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺点。
    5. 信号量(Semaphores) :信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信方式主要用于解决与同步相关的问题并避免竞争条件。
    6. 共享内存(Shared memory) :使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式。
    7. **套接字(Sockets) **: 此方法主要用于在客户端和服务器之间通过网络进行通信。套接字是支持 TCP/IP 的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
    8. 推荐阅读:Java进程间通信学习** **进程间通信IPC (InterProcess Communication)
  5. Java线程通信
    1. 线程通信:要想实现两个线程之间的协同,如线程的先后顺序,获取某个线程的执行结果
    2. 锁与同步:这种方式就是定义一些锁,使用syschronized关键字对象或代码块lock加锁,来达成线程通信
    3. 等待和通知机制:
      1. Object.wait和Object.notify,Object.notifyAll wait()方法和notify()方法必须写在synchronized代码块里面
      2. join()方法让当前线程陷入“等待”状态,等join的这个线程执行完成后,再继续执行当前线程。
      3. sleep方法,让当前线程休眠不释放锁
      4. CountdownLatch 主要是用来实现线程 D 在A、B、C都同步执行完毕后执行,它的基本用法是:创建一个计数器,并设置一个初始值, CountdownLatch countDownLatch = new CountDownLatch(3);调用countDownLatch.await()进入等待状态,直到计数值变为0;在其他线程调用countDownLatch.countDown(),该方法会将计数值减一;当计数器的值变为 0 时,countDownLatch.await()等待线程中的方法会继续执行下面的代码。CountDownLatch适用于一个线程需要等待多个线程的情况。
      5. CyclicBarrier,CyclicBarrier 的作用就是等待多个线程同时执行。其基本用法为:首先创建一个公共对象CyclicBarrier,并设置同时等待的线程数,CyclicBarrier cyclicBarrier = new CyclicBarrier(3);这些线程同时开始准备,准备好后,需要等待别人准备好,所以调用cyclicBarrier.await()方法等待别人;当指定的需要同时等待的线程都调用了该cyclicBarrier.await()方法时,意味着这些线程准备好了,那么这些线程就会开始同时继续执行。
    4. 线程执行完返回结果:FutureTask、Callable
    5. 推荐阅读:Java 中如何实现线程间通信 java中的多线程:线程使用、线程安全、线程通信

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

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

相关文章

读书笔记#深入理解Java虚拟机(第三版)# Java内存模型与线程

深入理解Java虚拟机&#xff08;第三版&#xff09;# 高效并发 chap12 Java内存模型与线程 概述 在许多场景下&#xff0c;让计算机同时去做几件事情&#xff0c;不仅是因为计算机的运算能力强大了&#xff0c;还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统的…

鸿蒙笔记--自定义点击事件

这一节主要了解一下鸿蒙中自定义点击事件&#xff0c;主要是实现在父组件点击子组件后获取子组件的返回参数。 栗子&#xff1a; import { MyCustomButton } from ./MyCustomButton;Entry Component struct Index {State message: string Hello World;build() {Column(){MyC…

第三十一章 Vue之路由(VueRouter)

目录 一、引言 1.1. 路由介绍 二、VueRouter 三、VueRouter的使用 3.1. 使用步骤&#xff08;52&#xff09; 3.2. 完整代码 3.2.1. main.js 3.2.2. App.vue 3.2.3. Friend.vue 3.2.4. My.vue 3.2.5. Find.vue 一、引言 1.1. 路由介绍 Vue中路由就是路径和组件的映…

软件测试学习笔记丨SeleniumPO模式

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22525 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…

【学习enable_if模板, 学习unqiue_str 删除操作】

enable_if 是 C 标准库中的一个模板结构体&#xff0c;它用于条件编译和 SFINAE&#xff08;Substitution Failure Is Not An Error&#xff09;。enable_if 的主要作用是通过条件编译来控制模板的实例化&#xff0c;从而实现条件编译和 SFINAE。 1. enable_if 的基本用法如下…

【自然资源】关于多测合一,你了解吗?

关于多测合一&#xff0c;你了解吗&#xff1f; “多测合一” 是指&#xff1a;按照“统一标准、多测合并、成果共享”要求和“应合尽合、能合则合”原则&#xff0c;对同一工程建设项目各个阶段的多项测绘服务事项进行整合优化的测绘服务和管理模式。 是将工程建设项目竣工验…

江协科技STM32学习- P28 USART串口数据包

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

HarmonyOS鸿蒙开发入门,常用ArkUI组件学习(二)

书接上回&#xff0c;让我们继续来学习ArkUI的其他组件 目录&#xff0c;可以点击跳转到想要了解的组件详细内容 组件四&#xff1a;Button组件五&#xff1a;Slider组件六&#xff1a; Column & Row组件七&#xff1a;循环控制组件八&#xff1a; List 组件四&#xff1a;…

SqlSugar查询达梦数据库遇到的异常情况

使用SqlSugar连接达梦数据库&#xff0c;联查两张表的数据遇到的奇怪问题&#xff1a;同一套代码&#xff0c;在一个环境中可以正常查询并返回数据&#xff0c;但在另一环境中运行则查不到数据。在个人电脑上测试时也能正确运行&#xff0c;搞不清楚是怎么回事&#xff0c;特此…

ip地址分为几大类-IP和子网掩码对照表

一、IP地址的基本概念与分类 IP地址是用于在网络中标识每个设备的逻辑地址。互联网协议将IP地址分为A、B、C、D和E五类&#xff0c;其中A、B、C三类最常用&#xff0c;它们主要根据地址的首位位数以及用途进行划分。 A类地址&#xff1a; 范围&#xff1a;0.0.0.0 - 127.255.2…

【AI开源项目】Botpress - 开源智能聊天机器人平台及其部署方案

文章目录 Botpress 概述Botpress 的定位 Botpress 的主要特点1. OpenAI 集成2. 易于使用3. 定制和扩展性4. 多平台支持5. 集成和扩展 API6. 活跃的社区和详尽的文档 部署方案集成集成开发集成部署机器人示例开发工具代理本地开发先决条件从源代码构建 Botpress 如何解决常见问题…

JetPack Compose安卓开发之底部导航Tabbar

效果&#xff0c;页面切换 项目结构 TabBar.kt package com.weimin.strollerapp.components.tabbarimport androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.f…

SpringBoot应用:精品在线试题库的设计与实现

2 相关技术 2.1 Spring Boot框架简介 Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Sprin…

乐鑫esp32和esp32s3使用flash download tool V3.9.7工具下载固件的使用说明

使用esp32IDF工具编程后使用vscode内置的烧录工具&#xff08;火的图标按钮&#xff09;烧录是正常的&#xff0c;说明程序没有问题。 如果要使用flash download tool V3.9.7工具下载固件还是有些要注意的事项&#xff1a; 1.三个bin文件分别在&#xff1a; 第一个&#xff1a;…

如何在Linux系统中使用Apache HTTP Server

如何在Linux系统中使用Apache HTTP Server Apache简介 安装Apache 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 启动Apache服务 验证Apache是否正在运行 访问Apache默认页面 配置Apache虚拟主机 创建虚拟主机配置文件 示例虚拟主机配置 创建网站根目录 准备静态网站内…

HTTP相关返回值异常原因分析,第二部分

今天我们讲讲HTTP相关返回值异常如何解决&#xff08;实例持续更新中&#xff09; 一、4xx状态码 这些状态码表示请求有问题&#xff0c;通常是由于客户端的错误引起的。 1.1 400 Bad Request: 请求格式不正确&#xff0c;服务器无法理解。 状态码400的含义&#xff1a; …

8、Node.js Express框架

五、Express框架 5.1概念 Express框架是一个基于Node.js平台的极简、灵活的WEB开发框架:www.express.com.cn 简单来说,Express是一个封装好的工具包,封装了很多功能,便于我们开发WEB应用 5.2安装 npm i express5.3 Express初体验 //01-express初体验.js //1.导入exrp…

学习笔记——三小时玩转JQuery

也可以使用在线版&#xff0c;不过在线版需要有网络&#xff0c;网不好的情况下加载也不好 取值的时候也是只会取到有样式的纯文本&#xff0c;不会取到标签&#xff0c;会取到标签效果 prepend和append这两个方法用的比较多&#xff0c;before和affter用的比较少 想要把代码写…

Rust 力扣 - 54. 螺旋矩阵

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们只需要一圈一圈的从外向内遍历矩阵&#xff0c;每一圈遍历顺序为上边、右边、下边、左边 我们需要注意的是如果上边与下边重合或者是右边与左边重合&#xff0c;我们只需要遍历上边、右边即可 题解代码 i…

企业项目开发的流程

一.立项阶段 1.市场调研 了解市场需求和竞争对手情况。全面的市场调研分析报告。 用户调研&#xff1a;产品组针对目标用户进行定量和定性的调查&#xff0c;了解其需求和行为习惯&#xff0c;为产品的功能和设计方向提供依据。 举例&#xff1a;终端管家.用户分为商户和渠…