Android面试题——后续分类整理归纳(持续更新中...)(2021/9/14更新)

1.Handler知识点(必问)

1.面试官问:Handler作用?

回答:handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以发消息,也可以通过它处理消息。
1)传递消息Message
2)子线程通知主线程更新UI

2.面试官问:handler怎么使用会产生内存泄露?如何解决内存泄漏问题

回答:根本原因是因为 Handler 对象持有了外部类 Activity 的引用。可以使用静态的内部类继承 Handler或者单独写一个类


2.界面适配:约束布局:约束百分比

1.面试官问:编写界面需要很多嵌套,这会有一定的性能影响,有那些方式优化性能?

回答: ConstraintLayout 或 RelativeLayout布局可以优化,ConstraintLayot 类似 RelativeLayout,但是更灵活更强大。 具有更强的性能优势,简化嵌套深度。更好的屏幕适配,可以使用比例来适配(ayout_constraintGuide_percent属性),效果更好。l


3.RecycleView基础:显示界面 布局复用 内存优化

1. .面试官问:Listview和Recyclerview的区别

回答:

  • Listview继承重写BaseAdapter类; 自定义ViewHolder与convertView的优化(判断是否为null);recyclerview继承重写RecyclerView.Adapter与RecyclerView.ViewHolder
    设置LayoutManager,以及layout的布局效果

  • 布局上的不同:listview:布局比较单一,只支持竖直方向滑动;recyclerview:三种布局,线性布局,这个和listview相似 ,实现横向/纵向列表方向的item,网格布局,可以指定item的数量,瀑布流布局,可以指定列表方向,也可以指定同方向的item数量

  • 布局刷新:listview中通常刷新数据 notifyDataSetChanged() ,这种刷新是全局刷新的,每一个item的数据都会重新加载一次,这样很消耗资源,在一些需要频繁更新数据的场景,比如淘宝实时更新的界面,listview实现会很鸡肋;recyclerview可以通过 notifyItemChanged() 来实现局部刷新;ListView实现局部刷新,依然是可以实现的,当一个item数据刷新时,我们可以在Adapter中,实现一个onItemChanged()方法,在方法里面获取到这个item的position(可以通过getFirstVisiblePosition()),然后调用getView()方法来刷新这个item的数据

  • 空数据处理:ListView 提供了 setEmptyView 这个 API 来让我们处理 Adapter 中数据为空的情况

  • 复用item:Recyclerview可复用item,Listview默认每次加载一个新的item创建一个新view

  • ViewHolder:Listview需要创建自定义viewHolde,RecycleView继承recyclerView.ViewHolder

  • 嵌套滚动机制:ListView 不支持嵌套滚动机制,Recyclerview实现NestedScrollingChild接口支持嵌套滚动机制

2.面试官问:如何优化RecyclerView?

回答:

  • 尽量将复杂的数据处理操作放到异步中完成。RecyclerView需要展示的数据经常是从远端服务器上请求获取,但是在网络请求拿到数据之后,需要将数据做扁平化操作,尽量将最优质的数据格式返回给UI线程。
  • 优化RecyclerView的布局,避免将其与ConstraintLayout使用
  • 针对快速滑动事件,可以使用addOnScrollListener添加对快速滑动的监听,当用户快速滑动时,停止加载数据操作。
  • 如果ItemView的高度固定,可以使用setHasFixSize(true)。这样RecyclerView在onMeasure阶段可以直接计算出高度,不需要多次计算子ItemView的高度,这种情况对于垂直RecyclerView中嵌套横向RecyclerView效果非常显著。
  • 当UI是Tab feed流时,可以考虑使用RecycledViewPool来实现多个RecyclerView的缓存共享。

4.Fragment生命周期,Activity生命周期

1.面试官问:Fragment和Activity生命周期

回答:

  • Activity执行从Created开始,对应于Fragment的是onAttach()->onCreate()->onCreateView()->onActivityCreated->,接着两者都是onStart()->onResume()->onPause()->onStop(),接着Activity对应为onDestroyed()结束,对于Fragment是onDestroyedView()->onDestroye()->onDetach()

  • 启动时一般都是先执行Activity的生命周期,再执行Fragment的

  • 正常启动时除了Fragment的onStart()先于Activity的onStart()先执行这一个特例

  • 正常启动时每个Fragment的onAttach->onActivityCreated这四个生命周期一般都是一组一起执行的,在执行完这一组方法前不会去执行其它Fragment的生命周期方法

  • 销毁过程Activity的生命周期方法始终在Fragment之前执行(onPause()开始),Fragment的onDestroyView->onDetach,一起执行

  • 横竖屏切换生命周期方法执行都是一致的,先销毁再创建,相比正常销毁启动多执行的方法是onSaveInstanceState与onRestoreInstanceState,一般都是先执行Activity的生命周期,再执行Fragment的


5.Service知识点

1.面试官问:一定听过 Service 吧,是怎么理解的?

回答:
Service 是一个专门在后台执行长时间操作的类,它并不与用户产生 UI 交互。它提供了两种启动方式。

  • started
    其它组件调用 startService() 启动一个 Service。一旦启动,Service 将一直运行在后台,即使启动这个 Service 的组件已经被销毁。通常一个被 start 的 Service 会在后台执行单独的操作,也并不需要给启动它的组件返回结果。只有当 Service 自己调用 stopSelf() 或者其它组件调用 stopService() 才会终止。
  • bind
    其它组件可以调用 bindService() 来绑定一个 Service。这种方式会让 Service 和启动它的组件绑定在一起,当启动它的组件销毁的时候,Service 也会自动进行 unBind 操作。同一个 Service 可以被多个组件绑定,只有所有绑定它的组件都进行了 unBind 操作,这个 Service 才会被销毁。

2.面试官问:这两种方式对应的生命周期,可以简单讲讲?

Android面试题——后续分类整理归纳(持续更新中...)(2021/9/14更新)_第1张图片
回答:

  • onCreate() 和 onDestroy() 均会被回调

  • 两条生命周期路径都可以包含两个嵌套的生命周期:

    完整生命周期(entire lifetime):从 onCreate() 被调用,到 onDestroy() 返回。和 Activity 类似,一般在 onCreate() 方法中做一些初始化的工作,在 onDestroy() 中做一些资源释放的工作。如,若 Service 在后台播放一个音乐,就需要在 onCreate() 方法中开启一个线程启动音乐,并在 onDestroy() 中结束线程。

    活动生命周期(activity lifetime):从 onStartCommand() 或 onBind() 回调开始,由相应的 startService() 或 bindService() 调用。start 方式的活动生命周期结束就意味着完整证明周期的结束,而 bind 方式,当 onUnbind() 返回后,Service 的活动生命周期结束。

3.面试官问:Service 的 onCreate() 可以执行耗时操作吗?

回答: Service 运行在主线程中,它并不是一个新的线程,也不是新的进程,onCreate() 并不能执行耗时操作。

4.面试官问:那如果要在 Service 中执行耗时操作,怎么做?

回答:

  • 使用 Thread,开一个线程,然后一阵混沌操作。

  • 使用 AysncTask 或 HandlerThread 来替代 Thread 创建线程。

  • IntentService 也是一个不错的选择。


6.网络通信协议

TCP/IP协议,TCP/IP是一个协议组,分为3个层次:

  • 网络层:包括IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。

  • 传输层:包括TCP协议和UDP协议。

  • 应用层:包括HTTP、FTP、TELNET、SMTP、DNS等协议。

Socket属于传输层的技术, API实现TCP协议后即可用于HTTP通信,实现UDP协议后即可用于FTP通信


1.面试官问:HTTP网络请求的方式?

回答:

  • 有三种方式HttpURLConnectoin、HttpClient、AndroidHttpClient(很少用)
  • HttpURLConnectoin提供与联网有关的类,包括流和数据包套接字、Internet协议、常见HTTP处理,通过HttpURLConnection(继承自URLConnection),可用于向指定网站发送GET请求、POST请求。
  • HttpClient是Apache提供的HTTP网络访问接口
  • AndroidHttpClient:Android特有的网络编程,如:访问WiFi,访问Android联网信息,邮件等功能。
  • HttpURLConnection是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目

2.面试官问:GET请求和POST请求的区别?

回答:

  • get提交,提交的信息都显示在地址栏中。post提交,提交的信息不显示在地址栏中
  • get提交,对于敏感的数据信息不安全。post提交,对于敏感信息安全。
  • get提交,对于大数据不行,因为地址栏存储体积有限post提交,可以提交大体积数据
  • get提交,将信息封装到了请求消息的请求行中post提交,将消息封装到了请求体中

3.面试官问:基于Socket套接字的服务器和Android客户端交互的一个实例?

回答:

  • 套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认
  • 服务端开启一个子线程来循环的从客户端那里获取消息,获取消息后将这个消息打印出来,并将这个消息再发送给客户端

5.面试官问:Socket与HTTP区别?

回答:

  • 请求—响应方式不同:通常情况下Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开,Socket连接需要通过轮询告诉网络,该连接处于活跃状态。HTTP连接使用的是“请求—响应”的方式,需要数据的时发送一条请求,服务器收到请求后返回相应的数据,请求过后这个连接就不在了,当下次需要数据时再发送请求
  • 对数据的即时性要求比较高的情况下一般采用Socket通讯,例如聊天的功能
  • 对数据的即时性要求不是特别高的情况下一般采用HTTP通讯, 比如在项目中,我们请求的接口,请求一次就给我们返回数据,很少会去不断的去请求服务器的数据。

7.ViewModel、LiveData

1.面试官问:谈谈对ViewModel和LiveData的了解?

回答:ViewModel类的设计目的是以一种关注生命周期的方式存储和管理与UI相关的数据。在同一个Activity中存在多个Fragment时,相互传递数据,一般通过定义接口来实现,Acticity从中协调。使用ViewModel能轻易解决Activity和Fragment之间的通信。Activity不需要做任何事情,不需要干涉这两个Fragment之间的通信。Fragment不需要互相知道,即使一个消失不可见,另一个也能正常的工作。Fragment有自己的生命周期,它们之间互不干扰,即便你用一个FragmentC替代了B,FragmentA也能正常工作,没有任何问题。

LiveData是一个可观察的数据持有者类。LiveData在生命周期状态更改时通知Observer对象,更新这些Observer对象中的UI。观察者可以在每次应用程序数据更改时更新UI,而不是每次发生更改时更新UI(Activity或者Fragment只要在需要观察数据的时候观察数据即可,不需要理会生命周期变化了。这一切都交给LiveData来自动管理)。

ViewModel用来存储和管理与UI相关的数据,LiveData用来通知和接收数据的改变从而更新界面,两者是搭配在一起使用的。

2.面试官问:LiveData有没有内存泄漏j?

回答:当页面销毁时他们会自动被移除,不会导致内存溢出。

8.MVC、MVP、MVVM 之间有何区别?

1.面试官问:谈谈对MVC的了解?

回答:视图层(View):对应于xml布局文件和java代码动态view部分。

控制层(Controller):控制层是由Activity来承担的,Activity本来主要是作为初始化页面,展示数据的操作,但是因为XML视图功能太弱,所以Activity既要负责视图的显示又要加入控制逻辑,承担的功能过多。

模型层(Model):针对业务模型,建立的数据结构和相关的类,它主要负责网络请求,数据库处理,I/O的操作。

2.面试官问:谈谈对MVP的了解?

回答: 视图层(View):负责绘制UI,与用户进行交互(在Android中体现为Activity),把Activity中的UI逻辑抽象成View接口

协调者(Presenter):作为View与Model交互的中间纽带,处理与用户交互的负责逻辑,业务逻辑抽象成Presenter接口。

模型层(Model):负责存储,检索以及操纵数据。

3.面试官问:谈谈对MVVM的了解?

回答:视图层(View):展示数据,接收到用户的操作传递给viewModel层,通过dataBinding实现数据与view的单向绑定或双向绑定。View层不做任何业务逻辑、不涉及操作数据、不处理数据、UI和数据严格的分开

视图模型层(ViewModel ):调用Model层获取数据,以及业务逻辑的处理。 ViewModel 和Presenter 的作用类似 ,只不过是通过 databinding 将数据与UI进行了绑定。ViewModel 不做和UI相关的事

模型层(Model):获取数据,model层将结果通过接口的形式传递给ViewModel层

4.面试官问:这些设计模式之间有何区别?

回答:按照MVC的分层,Activity既要负责视图的显示又要加入控制逻辑,Activity不仅承担了View的角色,还承担了一部分的Controller角色;

MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成Presenter接口,Model类还是原来的Model。

MVVM中的ViewModel 和Presenter 的作用类似,但是ViewModel 层不会持有任何控件的引用,更不会在ViewModel中通过UI控件的引用去做更新UI的事情

你可能感兴趣的:(《面试》系列,android,面试)