likes
comments
collection
share

Android面试题-2022

作者站长头像
站长
· 阅读数 60

1 wait和 sleep 的区别

wait是Object的方法,wait是对象锁,锁定方法不让继续执行,当执行notify方法后就会继续执行,sleep 是Thread的方法,sleep 是使线程睡眠,让出cpu,结束后自动继续执行

2 View和SurfaceView的区别

View基于主线程刷新UI,SurfaceView子线程又可以刷新UI

3. View的绘制原理

View为所有图形控件的基类,View的绘制由3个函数完成 measure,计算视图的大小 layout,提供视图要显示的位置 draw,绘制

4. 简述TCP,UDP,Socket

TCP是经过3次握手,4次挥手完成一串数据的传送 UDP是无连接的,知道IP地址和端口号,向其发送数据即可,不管数据是否发送成功 Socket是一种不同计算机,实时连接,比如说传送文件,即时通讯

5.进程和线程的区别

概念:进程包括多个线程,一个程序一个进程,多线程的优点可以提高执行效率,提高资源利用率 创建:Thread类和Runnable接口, 常用方法有: start()用于启动线程 run()调用线程对象中的run方法 join()合并插队到当前线程 sellp()睡眠释放cpu资源 setPriority()设置线程优先级

6.RecyclerView和ListView的区别

缓存上:前者缓存的是View+ViewHolder+flag,不用每次调用findViewById,后者则只是缓存View 刷新数据方面,前者提供了局部刷新,后者则全部刷新

7.MVC ,MVP,MVVM

MVC:View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些 业务逻辑。 在MVC模型里,更关注的Model的不变,而同时有多个对Model的不同显示,及View。所以,在MVC模型里,Model不依赖于View,但是 View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。 MVP:MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。 MVVM:数据双向绑定,通过数据驱动UI,M提供数据,V视图,VM即数据驱动层

8.说下 Activity 跟 跟 window , view 之间的关系?

Activity 创建时通过 attach()初始化了一个 Window 也就是PhoneWindow,一个 PhoneWindow 持有一个DecorView 的实例,DecorView 本身是一个 FrameLayout,继承于 View,Activty 通过setContentView 将xml 布局控件不断 addView()添加到 View 中,最终显示到 Window 于我们交互;

9.Java中堆和栈的理解

在Java中内存分为两种,一种是栈内存,另一种是堆内存

堆内存:用于存储Java中的对象和数组,当我们new一个对象或创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放,堆内存的特点:先进先出,后今后出,②可以动态的分配内存的大小,生存期不必告诉编译器,但存取速度较慢;

栈内存:主要用来执行程序用,比如基本类型的变量和对象的引用变量,其特点:①先进后出,后进后出,②存取速度比堆快,仅次于寄存器,栈数据可以共享,但其在栈中的数据大小和生存期必须是确定的;

栈内存和堆内存都属于Java内存的一种,系统会自动去回收它,但对于堆内存开发人员一般会自动回收。

栈是一块和线程紧密相关的内存区域,每个线程都有自己的栈内存,用于存储本地变量、方法参数和栈调用一个线程中存储的变量,对于其他线程是不可见的,而堆是所有线程共享的一个公用内存区域,对象都在堆里创建,但为了提升效率,线程会从堆中拷贝一个缓存到自己的栈中,如果多个线程使用该变量,就可能引发问题,这是volatile修饰变量就可以发挥作用,他要求线程从主存中读取变量的值。

10.Android常用的数据存储方式(4种)

使用SharedPreference存储:保存基于xml文件存储的key-value键值对数据,通常用来存储一些简单的配置信息;

文件存储方式:Context提供了两个方法来打开数据文件的文件IO流;

SQLite存储数据:SQLite是轻量级的嵌入式数据库引擎,支持SQL语言;

网络存储数据:通过网络存储数据;

11.Activity生命周期中的7个方法:

onCreate( ):当Activity被创建时调用;

onStart( ):当Activity被创建后将可见时调用;

onResume( ):(继续开始)当Activity位于设备最前端,对用户可见时调用;

onPause( ):(暂停)当另一个Activity遮挡当前Activity,当前Activity被切换到后台时调用;

onRestart( ):(重新启动)当另一个Activity执行完onStop()方法,又被用户打开时调用;

onStop( ):如果另一个Activity完全遮挡了当前Activity时,该方法被调用;

onDestory( ):当Activity被销毁时调用;

12.Activity的四种启动模式

standard、singleTop、singleTask和singleInstance,他们是在配置文件中通过android:LauchMode属性配置;

standard:默认的启动模式,每次启动会在任务栈中新建一个启动的Activity的实例;

SingleTop:如果要启动的Activity实例已位于栈顶,则不会重新创建该Activity的实例,否则会产生一个新的运行实例;

SingleTask:如果栈中有该Activity实例,则直接启动,中间的Activity实例将会被关闭,关闭的顺序与启动的顺序相同;

SingleInstance:该启动模式会在启动一个Activity时,启动一个新的任务栈,将该Activity实例放置在这个任务栈中,并且该任务栈中不会再保存其他的Activity实例;

Activity任务栈:即存放Activity任务的栈,每打开一个Activity时就会往Activity栈中压入一个Activity

任务,每当销毁一个Activity的时候,就会从Activity任务栈中弹出一个Activity任务,

由于安卓手机的限制,只能从手机屏幕获取当前一个Activity的焦点,即栈顶元素(

最上面的Activity),其余的Activity会暂居后台等待系统的调用;

13.View的绘制原理

View为所有图形控件的基类,View的绘制由3个函数完成 measure,计算视图的大小 layout,提供视图要显示的位置 draw,绘制

14.Okhttp连接池复用机制

15. Rxjava里面有几个角色

Observable:俗称被订阅者,被订阅者是事件的来源,接收订阅者​​(Observer)​​​的订阅,然后通过发射器​​(Emitter)​​发射数据给订阅者。
Observer:俗称订阅者,注册过程传给被订阅者,订阅者监听开始订阅,监听订阅过程中会把​​Disposable​​​传给订阅者,然后在被订阅者中的发射器​​(Emitter)​​​发射数据给订阅者​​(Observer)​​。
Emitter:俗称发射器,在发射器中会接收下游的订阅者​​(Observer)​​​,然后在发射器相应的方法把数据传给订阅者​​(Observer)​​。
Consumer:俗称消费器,消费器其实是​​Observer​​​的一种变体,Observer的每一个方法都会对应一个​​Consumer​​,比如Observer的onNext、onError、onComplete、onSubscribe都会对应一个Consumer。
Disposable:是释放器,通常有两种方式会返回​​Disposable​​​,一个是在​​Observer​​​的​​onSubscribe​​​方法回调回来,第二个是在​​subscribe​​订阅方法传consumer的时候会返回

16.RxJava操作符包含的操作符类型有如下几种:

1、创建操作符 :创建被观察者(Observable)对象&发送事件 2、转换操作符:变换被观察者(Observable)发送的事件。将Observable发送的数据按照一定的规则做一些变换,然后再将变换的数据发射出去。变换的操作符有map,flatMap,concatMap,switchMap,buffer,groupBy等等。 3、 合并操作符:组合多个被观察者(Observable)&合并需要发送的事件。包含:concatMap(),concat(), merge(),mergeArray(),concateArray(),reduce(),collect(),startWith(),zip(),count()等 4、功能操作符:辅助被观察者(Observable) 发送事件时实现一些功能性需求,如错误处理,线程调度。 5、过滤操作符:用于将Observable发送的数据进行过滤和选择。让Observable返回我们所需要的数据。过滤操作符有buffer(),filter(),skip(),take(),skipLast(),takeLast(),throttleFirst(),distainctUntilChange()。

17.为什么要在项目中使用OKHttp这个库?

  • OkHttp 提供了对最新的 HTTP 协议版本 HTTP/2 和 SPDY 的支持,这使得对同一个主机发出的所有请求都可以共享相同的套接字连接。

  • 如果 HTTP/2 和 SPDY 不可用,OkHttp 会使用连接池来复用连接以提高效率。

  • OkHttp 提供了对 GZIP 的默认支持来降低传输内容的大小。

  • OkHttp 也提供了对 HTTP 响应的缓存机制,可以避免不必要的网络请求。

  • 当网络出现问题时,OkHttp 会自动重试一个主机的多个 IP 地址。

18.OKHttp各个拦截器的作用:

  • interceptors:用户自定义拦截器

  • retryAndFollowUpInterceptor:负责失败重试以及重定向

  • BridgeInterceptor:请求时,对必要的Header进行一些添加,接收响应时,移除必要的Header

  • CacheInterceptor:负责读取缓存直接返回(根据请求的信息和缓存的响应的信息来判断是否存在缓存可用)、更新缓存

  • ConnectInterceptor:负责和服务器建立连接

19.从这个库OKHttp中学到什么有价值的或者说可借鉴的设计思想

使用责任链模式实现拦截器的分层设计,每一个拦截器对应一个功能,充分实现了功能解耦,易维护。

20.Retroft是做什么的

Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。Retrofit 2.0 开始内置 OkHttp,前者专注于接口的封装,后者专注于网络请求的高效。

21.RXJava变换操作符 Map flatMap concatMap buffer

  • map:【数据类型转换】将被观察者发送的事件转换为另一种类型的事件。

  • flatMap:【化解循环嵌套和接口嵌套】将被观察者发送的事件序列进行拆分 & 转换 后合并成一个新的事件序列,最后再进行发送。

  • concatMap:【有序】与 flatMap 的 区别在于,拆分 & 重新合并生成的事件序列 的顺序与被观察者旧序列生产的顺序一致。

  • buffer:定期从被观察者发送的事件中获取一定数量的事件并放到缓存区中,然后把这些数据集合打包发射。

转载自:https://juejin.cn/post/7166415061089517582
评论
请登录