1.面试官问:
Handler作用?
回答:
handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以发消息,也可以通过它处理消息。
1)传递消息Message
2)子线程通知主线程更新UI
2.面试官问:
handler怎么使用会产生内存泄露?如何解决内存泄漏问题
回答:
根本原因是因为 Handler 对象持有了外部类 Activity 的引用
。可以使用静态的内部类继承 Handler或者单独写一个类
1.面试官问:
编写界面需要很多嵌套,这会有一定的性能影响,有那些方式优化性能?
回答:
ConstraintLayout 或 RelativeLayout布局可以优化,ConstraintLayot 类似 RelativeLayout,但是更灵活更强大。 具有更强的性能优势,简化嵌套深度。更好的屏幕适配,可以使用比例来适配(ayout_constraintGuide_percent属性),效果更好。l
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?
回答:
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的
1.面试官问:
一定听过 Service 吧,是怎么理解的?
回答:
Service 是一个专门在后台执行长时间操作的类,它并不与用户产生 UI 交互。它提供了两种启动方式。
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 也是一个不错的选择。
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网络请求的方式?
回答:
2.面试官问:
GET请求和POST请求的区别?
回答:
3.面试官问:
基于Socket套接字的服务器和Android客户端交互的一个实例?
回答:
5.面试官问:
Socket与HTTP区别?
回答:
轮询
告诉网络,该连接处于活跃状态。HTTP连接使用的是“请求—响应
”的方式,需要数据的时发送一条请求,服务器收到请求后返回相应的数据,请求过后这个连接就不在了,当下次需要数据时再发送请求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?
回答:
当页面销毁时他们会自动被移除,不会导致内存溢出。
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的事情