avatar-decorate
空荡荡的月台 level
获赞
237
粉丝
62
关注
46
看过 TA
3027
中国石油大学(华东)
2024
C++
IP属地:山东
暂未填写个人简介
私信
关注
1、OkHttp整体思路    https://blog.csdn.net/Android_LeeJiaLun/article/details/1083261322、HTTP请求全链路讲解,包括软件和硬件3、相机前置摄像头拍出来的照片和正常有什么区别(相反)4、父view是如何把子view绘制出来的    首先最外层的ViewGroup的onMeasure方法被调用,使用onMeasure方法传入的MeasureSpec和子View的LayoutParams得到要传给子View的MeasureSpec,调用子View的measure方法,传入上面计算出的MeasureSpec,如果子View还是ViewGroup,那么回到第一层进行迭代。如果子View是View,那么就根据这个MeasureSpec以及自己的特性进行计算,最后调用#setMeasuredDimension#方法,完成自己最后的测量。5、什么时机会调用newIntent()    https://blog.csdn.net/i_nclude/article/details/105472751 singleTop模式:onPause—>onNewIntent—>onResume SingleInstance,SingleTask模式:onNewIntent—>onRestart—>onStart—>onResume6、属性动画的原理7、不同动画之间的区别8、在onCreate的子线程里更新UI没有报错,这是什么原因导致的。    ViewRootImp此时还没有创建,还未进行当前线程的判断9、Handler内存泄漏 引用链 主线程 —> threadlocal —> Looper —> MessageQueue —> Message —> Handler —> Activity10、讲一下RecyclerView的缓存机制,滑动10个,再滑回去,会有几个执行onBindViewhttps://www.cnblogs.com/jimuzz/p/14040674.html
0 点赞 评论 收藏
转发
1、相册项目难点    recyclerview加载大量图片的时候如何保证不出现卡顿和内存抖动现象;    1、加载图片的时候采用多线程异步加载 (AsynTask)    2、recyclerview快速滑动的时候暂停加载,慢速滑动或者停止滑动的时候开始加载        Recyclerview其中有一个 OnScrollListener ,重写onScrolled方法,判断偏移量dy是否超过阈值。其中的onScrollStateChanged(RecyclerView recyclerView, int newState),第二个参数 newState 就是滑动的状态,根据滑动的状态判断是否加载。    3、当前呈现给用户的加载;当前未呈现的不加载        获取可见item的上下位置区间,只加载区间内的数据。    4、采用复用池策略,把使用过的bitmap回收复用,防止频繁创建bitmap,出现内存抖动    5、采用缓存策略,缓存图片,提高加载的效率,LruCache    6、图片压缩美团前端一面1、View和SurfaceView的区别    绘图线程不同:View在主线程上绘图,而SurfaceView在子线程上绘图。    缓冲机制不同:View没有双缓冲机制,而SurfaceView底层已实现双缓冲机制。    适用场景不同:View适用于主动更新,如定时刷新等,而SurfaceView适用于频繁刷新或刷新时数据处理量很大的场景。2、内存泄漏造成的原因    1、非静态内部类和匿名类内部类都会潜在持有它们所属的外部类的引用    2、资源未关闭造成的内存泄漏    3、单例造成的内存泄漏
0 点赞 评论 收藏
转发
1、MVC、MVP、MVVM的区别    MVC 模式将程序分为三个部分:模型 、视图(xml文件)、控制器(activity)。目的:将业务逻辑放在控制器里,把业务逻辑和视图层分离;缺点:Activity变得臃肿,Model 将新的数据发送到 View。    MVP 模式将程序分为三个部分:模型、视图(activity)、管理层(Presenter)。MVC模式的View 层和 Model 层存在耦合,MVP 模式将 View 层和 Model 层解耦,之间的交互只能通过 Presenter 层。缺点:Presenter手动更新View麻烦    MVVM模式中,View界面的更新从由Presenter驱动,变成了自动监听数据,随着数据变化而自动更新。2、抽象类与接口的区别    接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系。3、kotlin的扩展函数“let、run、also、apply”的作用和区别    1、执行目的         let:用于对一个可空对象进行操作,         run:用于执行一个lambda表达式并返回结果         also:用于执行一个lambda表达式并返回对象本身         apply:用于对一个对象进行初始化和配置操作    2、传参类型         let会将对象作为lambda表达式的参数传递         run不会将对象作为参数传递给lambda表达式         also将对象作为参数传递给lambda表达式         apply使用this关键字引用当前对象,而不是将对象作为参数传递给lambda表达式    3、返回值         let返回lambda表达式的结果         run返回lambda表达式的结果         also返回值是对象本身         apply返回值是对象本身4、by lazy 与 lateinit 的异同    lateinit 是延迟初始化, by lazy 是懒加载即初始化方式已确定,只是在使用的时候执行。    lateinit用var修饰,by lazy 使用val修饰
0 点赞 评论 收藏
转发
1、recyclerview的局部刷新是怎么实现的    在Android的RecyclerView中,当你需要局部刷新数据时,你应该在数据发生改变的地方调用notifyItemChanged(int position)方法。    // 在数据发生改变后,通知RecyclerView刷新数据    recyclerViewAdapter.notifyItemChanged(index);2、recyclerview第二级缓存和第四级缓存重走onBindViewHolder()方法吗    第一级、第二级缓存、,不需要重新bindViewHolder    第四级缓存RecycledViewPool缓存的ViewHolder是全新的,所以取出来的时候需要走onBindViewHolder()方法。3、OkHttp的拦截器讲一下4、singleTop(栈顶复用)启动模式,打开相同的activity会走哪些生命周期    onPause    onNewIntent    onResume5、measureSpec是如何获取的    MeasureSpec是View的内部类,其封装了一个View的规格尺寸,包括View的宽和高的信息    系统会将View的LayoutParams根据父容器所施加的规则转换成对应的MeasureSpec6、线程间通信方式    共享内存 + 消息队列7、sevice与线程的区别    生命周期不同:Service有自己的生命周期,可以在后台长时间运行。线程的生命周期与应用程序的生命周期相同    1.Thread是程序执行的最小单元,可以执行异步操作。Service是运行在主线程中,不独立,依附于主线程。    2.Thread可以执行耗时操作,但是Service不可以,因为Service运行在主线程上。    3.Service中需要开启子线程才能执行耗时操作,在Service开启线程好处是如果Activity被销毁,但是Service仍然运行,不会影响后台任务的运行。如果在Activity中创建子线程当Activity被销毁之后,无法获取到之前创建的子线程实例。
投递小米集团等公司10个岗位
0 点赞 评论 收藏
转发
不得不说,不愧是淘宝,面的真的好难。1、线程池底层创建的原理2、lifecycle的原理    lifecycle是一种观察者设计模式,第一步是要注册观察者,观察者可以有多个,当被观察者生命周期变化的时候就轮询所有的观察者,把生命周期变化的事件一个一个分发给观察者。注册观察者是通过LifecycleRegistry实现的,通过addabserver函数添加到一个map容器里面。在activity里面绑定了一个空的Fragment感知和分发生命周期,Activity的生命周期执行的时候会对应的执行ReportFragment的生命周期方法。ReportFragment在生命周期方法中通过调用dispatch(Lifecycle. Event)方法分发的生命周期状态, 最终调用对应Activity的LifecycleRegistry对象的handleLifecycleEvent方法完成生命周期的分发。lifecycle中定义了状态机state,通过状态机我们就知道被观察者是因为执行了哪个生命周期导致了State状态发生了变化。在handleLifecycleEvent方法中先把执行生命周期后的state状态同步到lifecycle中。判断mState被观察者处于的状态,是不是比观察者保存的状态小,判断被观察者执行了什么生命周期方法,调用backwardPass或者forwardPass函数。然后遍历整个map容器中的观察者,调用观察者的diapatchEvent方法就能让观察者的onStateChange方法得到执行3、handler postdeleay原理    延时消息会和当前消息队列里的消息头的执行时间对比,如果比头时间靠前,则会成为新的消息头,否则就依次遍历,寻找合适的位置插入延时消息。4、HandlerThread原理
投递淘天集团等公司10个岗位
0 点赞 评论 收藏
转发
1、静态内部类和内部类的区别    1、静态内部类没有对外部类的引用,普通内部类有对外部类的引用    2、静态内部类可以有静态成员,非静态内部类则不能有静态成员    3、静态内部类只能够访问外部类的静态成员,非静态内部类则可以访问外部类的所有成员2、懒汉线程安全单例模式写法    public class LazySingleton {        private LazySingleton() {}        private static LazySingleton lazy = null;        public synchronized static LazySingleton getInstance() {            if (lazy == null) {                lazy = new LazySingleton();            }            return lazy;        }    }3、SurfaceView与TextureView的区别    CPU 数据上看,SurfaceView 要比 TextureView 优化 8%-13%    功耗数据上看,SurfaceView 要比 TextureView 平均功耗低 20mA 左右。    SurfaceView是独立的一层View,更像是独立的一个Window,不能加上动画、平移、缩放    TextureView更像是一般的View,像TextView那样能被缩放、平移,也能加上动画。    SurfaceView 绘制会有独立窗口, TextureView 没有独立的窗口,可以像普通的 View 一样,更高效更方便5、相册项目难点    recyclerview加载大量图片的时候如何保证不出现卡顿和内存抖动现象;    1、加载图片的时候采用多线程异步加载    2、recyclerview滑动的时候暂停加载,停止滑动的时候开始加载    3、当前呈现给用户的加载;当前未呈现的不加载    4、采用复用池策略,把使用过的bitmap回收复用,防止频繁创建bitmap,出现内存抖动    5、采用缓存策略,缓存图片,提高加载的效率,LruCache
0 点赞 评论 收藏
转发
记录一下不会的内容1、java的设计原则2、LinearLayout和FrameLayout的绘制流程有什么区别    文心一言答案:FrameLayout是从上到下的一个堆叠的方式进行绘制的                         LinearLayout在两个方向上绘制的布局,绘制的时候按照指定的方向绘制,比FrameLayout要慢3、如果发现Recyclerview的一些性能问题,应该如何优化?    1、bindViewHolder方法是在UI线程进行的,如果在该方法进行耗时操作,将会影响滑动的流畅性    2、减少布局层级,可以考虑使用自定义View来减少层级    3、RecyclerView数据预处理    4、加大RecyclerView的缓存3、相机的旋转是怎么做适配的    相机旋转后通过CameraCaptureSession.OnConfiguredListener回调函数通知的    https://blog.csdn.net/wangyantaozzu/article/details/1037681424、相机预览的适配    1、根据预览的尺寸,将屏幕的大小根据预览比例调整界面的布局,截取屏幕的部分出来与预览一致    2、根据预览的尺寸,将TextureView显示时的画布按屏幕进行比例缩放,偏移再展示到TextureView中    建议第二种5、camera2与camera1的区别    1、Camera1只能一次拍摄一张图片,而Camera2支持一次拍摄多张图片    2、Camera2有CameraCharacteristics实例专门提供相机信息,可以在不开启相机的前提下检查所有相机信息    3、camera2改进了新硬件的性能,使用更先进的API架构;    4、可以获取更多的帧(预览/拍照)信息以及手动控制每一帧的参数;    5、支持调整focus distance, 剪裁预览/拍照图片    6、支持更多图片格式(yuv/raw);
投递腾讯等公司10个岗位
0 点赞 评论 收藏
转发
今天字节客户端三面,面试官应该是leader,一上来就一副不感兴趣的脸。问了下面几个问题。1、你擅长什么?答:安卓2、sp和dp的区别,px为什么要转为dp    px没有固定的物理长度,如果用px作为设计单位,那么在屏幕像素密度(ppi)不同的情况下,图片显示的大小是不一样的。我们在1pt=1px的时候用1倍图,在1pt=2px的时候用两倍图,这样,在屏幕上显示图片的大小就一致了。3、kotlin为什么要用内联函数    在kotlin中,因为出现了大量的高阶函数,每一个函数参数都会被编译成一个对象,使得内存分配(对于函数对象和类)和虚拟调用会增加运行时间的开销。所以才会出现inline内联函数。可以通过inline的标注,把原本需要生成的一个类的开销节省了,同时也少了一层方法栈的调用。调用内联函数的地方变成了内联函数的内部语句,如果内联函数中的函数类型使用了lambda表达式,则进一步内联lambda表达,将lambda表达式的函数体替换为调用lambda表达式的地方4、apply是怎么实现的    这个问题查了网上的例子真的没看懂,有没有朋友教一下5、子线程为什么不能更新UI    子线程可能会有多个,存在多个线程同时操作一个控件的情况    子线程可以在ViewRootImpl还没有创建之前更新UI的    访问UI是没有加对象锁的,在子线程环境下更新UI,会造成各种未知风险的6、SharePreference用过吗,讲一下    SharedPreferences 是 Android 提供的数据持久化的一种手段,适合单进程、小批量的数据存储与访问    SharedPreferences的实现是基于单个xml文件实现的    commit()是线程安全的,但是性能慢,同步操作,在当前线程完成写文件操作。使用了synchronized关键字来保证其线程安全    apply()是线程不安全的,但是性能高,是异步处理IO操作。7、两个瓶子从100层掉落,多少次知道哪层掉下会碎。反正没几个会的,然后面试官一脸不耐烦,然后说原来你擅长的是java,你说你会安卓,但是刚才的情况安卓也不咋行。然后也没问我java,就结束了,总共只有35分钟面试。。。。。
投递字节跳动等公司10个岗位
0 点赞 评论 收藏
转发
牛客网
牛客企业服务