拿下头条,美团,阿里Offer,android开发艺术探索

####2.面试情况

阿里(蚂蚁金服):拿到 offer

头条(抖音、火山):拿到 offer

美团(美团平台):拿到 offer

腾讯(腾讯音乐):二面挂

####3. 准备
这部分将结合我自己的经验,为大家准备面试提供一个参考。

尽早开始准备

首先,尽早开始准备。足够的时间是充足的准备的基本保证。不用担心因为早准备而遗忘的问题,因为每一次看都会比上一次看快很多。随着复习次数增加,对知识点的掌握也会更加牢固。我一些同学到面试前一个月甚至前几天才准备,这时再想准备好庞大的知识点就力不从心了,自然面试结果也不好。因此,一定要尽早开始准备,一定要尽早开始准备,一定要尽早开始准备。我是在面试前半年左右时开始系统地准备,那时其实已经有点晚了。

形成自己的面试知识体系
面试,简单地说就是回答出更多的问题。而准备面试,自然就要掌握更多面试中可能问到的知识。为了方便系统地对知识点进行学习和复习,我觉得在准备阶段形成一个自己的面试知识体系非常重要。并且,在学习过程中,你的体系要不断地完善。各种零散的知识点是不方便系统地学习和复习的。

具体来说,大致过程如下:

1)整理面试需要掌握的知识点。可以通过 Github 和 博客上别人整理的面试总结或者知识脑图,结合自己的项目经历和面试经验整理出一个面试涉及的知识体系。

2)结合自己的情况确定学习计划。可以看着自己整理的知识体系,思考一下这两个问题:“我掌握了哪些知识、掌握程度如何”、“需要学习哪些知识、优先级如何”。

3)学习新的知识和巩固自己擅长的知识。同时,不断完善自己的知识体系。

4)在自己心中形成一个知识体系之后,不仅学习的时候更有针对性和计划性,面试时心态也会好很多。另外写简历和面试时也可以用一些技巧,比如在对自己有一个明确的认识的前提下可以避开自己不擅长的知识点,突出自己擅长的知识点。

###面试题

####1.跨进程通信的几种方式
Intent,比如拨打电话
ContentProvider数据库存储数据
Broadcast广播通信
AIDL通信,通过接口共享数据

####2.wait和sleep 的区别

wait是Object的方法,wait是对象锁,锁定方法不让继续执行,当执行notify方法后就会继续执行,sellp是Thread的方法,sellp是使线程睡眠,让出cpu,结束后自动继续执行

3.String,StringBuffer,StringBuilder的区别

String不可改变对象,一旦创建就不能修改

String str=“aaa”;
str=“bbb”;

以上代码虽然改变了str,但是执行过程是回收str,把值赋给一个新的str
StringBuffer创建之后,可以去修改
StringBuilder也可修改,执行效率高于StringBuffer,不安全
当字符赋值少使用String
字符赋值频繁使用StringBuilder
当多个线程同步操作数据,使用StringBuffer

####4.View和SurfaceView的区别
View基于主线程刷新UI,SurfaceView子线程又可以刷新UI

5.View的绘制原理

View为所有图形控件的基类,View的绘制由3个函数完成
measure,计算视图的大小
layout,提供视图要显示的位置
draw,绘制

6.简述JNI

是java和c语言之间的桥梁,由于java是一种半解释语言,可以被反编译出来,一种重要涉及安全的代码就使用了C编程,再者很多底层功能调用C语言都实现了Java没必要重复造轮子,所以定义了JNI接口的实现

7.简述TCP,UDP,Socket

TCP是经过3次握手,4次挥手完成一串数据的传送
UDP是无连接的,知道IP地址和端口号,向其发送数据即可,不管数据是否发送成功
Socket是一种不同计算机,实时连接,比如说传送文件,即时通讯

####8.音视频相关类

总体来说,分为几个类
视频录制方面,Camear摄像头录制视频类,MediaProjection屏幕录制视频类
编码方面,MediaCodec,MediaRecorder
预览方面,SurfaceView,GLSurfaceView,TextureView,VideoView

####9.进程和线程的区别

概念:进程包括多个线程,一个程序一个进程,多线程的优点可以提高执行效率,提高资源利用率
创建:Thread类和Runnable接口,
常用方法有:
start()用于启动线程
run()调用线程对象中的run方法
join()合并插队到当前线程
sellp()睡眠释放cpu资源
setPriority()设置线程优先级

####10.内存泄露如何查看和解决

概念:有些对象只有有限的生命周期,当他们的
任务完成之后,它们将被垃圾回收,如果在对象的生命周期本该结束的时候,这个对象还被一系列的引用,着就会导致内存泄露。
解决方法:使用开源框架LeakCanary检测针对性解决
常见的内存泄露有:
单例造成的内存泄露,例如单例中的Context生命周期大于本身Context生命周期
线程使用Hander造成的内存卸扣,当activity已经结束,线程依然在运行更新UI
非静态类使用静态变量导致无法回收释放造成泄露
WebView网页过多造成内存泄露
资源未关闭造成泄露,例如数据库使用完之后关闭连接

11.View的分发机制,滑动冲突

View的事件传递顺序有3个重要的方法,dispatchTouchEvent()是否消耗了本次事件,onInterceptTouchEvent()是否拦截了本次事件,onTouchEvent()是否处理本次事件,滑动冲突分为同方向滑动冲突,例如ScrollView和ListView,同方向滑动冲突,可以计算ListView高度而动态设置ListView的高度,ScrollView高度可变。例如ViewPager和ListView,不同方向滑动冲突,一个是横向滑动一个是竖直滑动,不同方向滑动可以判断滑动的x,y轴是横向还是竖直滑动,如果判断得到是横向滑动,就拦截ListView的事件,竖则反之。

####12.RecyclerView和ListView的区别

缓存上:前者缓存的是View+ViewHolder+flag,不用每次调用findViewById,后者则只是缓存View
刷新数据方面,前者提供了局部刷新,后者则全部刷新

####13.recyclerView嵌套卡顿解决如何解决

设置预加载的数量LinearLayoutManager.setInitialPrefetchItemCount(4),默认是预加载2个,
设置子项缓存,
设置自带滑动冲突解决属性rv.setHasFixedSize(true); rv.setNestedScrollingEnabled(false);
可以完美解决,不过Google不推荐RecyClerView嵌套使用,需要嵌套尽量找类似于ExpandableListView 第三方控件来解决

####14,谈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即数据驱动层

####15.dagger2

Dagger2是一个主要用于依赖注入的框架,减少初始化对象操作,降低耦合度
从直接Model中读取数据而不是通过 Controller。
MVVM:数据双向绑定,通过数据驱动UI,M提供数据,V视图,VM即数据驱动层

####15.dagger2

Dagger2是一个主要用于依赖注入的框架,减少初始化对象操作,降低耦合度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值