当前位置:首页 » 《关注互联网》 » 正文

Android面试题——后续分类整理归纳_Pandafz的博客

6 人参与  2021年08月31日 14:23  分类 : 《关注互联网》  评论

点击全文阅读


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通讯, 比如在项目中,我们请求的接口,请求一次就给我们返回数据,很少会去不断的去请求服务器的数据。

点击全文阅读


本文链接:http://zhangshiyu.com/post/26635.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1