Android面试题-2022

语言: CN / TW / HK

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

「其他文章」