Android面试题——后续分类整理归纳
Posted Pandafz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android面试题——后续分类整理归纳相关的知识,希望对你有一定的参考价值。
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.面试官问:
这两种方式对应的生命周期,可以简单讲讲?
回答:
-
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通讯, 比如在项目中,我们请求的接口,请求一次就给我们返回数据,很少会去不断的去请求服务器的数据。
以上是关于Android面试题——后续分类整理归纳的主要内容,如果未能解决你的问题,请参考以下文章
Android面试复习框架及题型解析,最新Android中高级面试题合集