颍上新闻,颍上资讯

您当前的位置:颍上人才网 >> 颍上资讯 >> 面试技巧 >> 跨进程通信方式、wait 和 sleep 的区别、String 相关类的区别
跨进程通信方式、wait 和 sleep 的区别、String 相关类的区别
2024-10-13|资讯来源: 网络整理|查看: 254

1.跨进程通信的几种方式

意图,例如拨打电话

ContentProvider数据库存储数据

广播通讯

AIDL通信,通过接口共享数据

2.wait和sleep的区别

wait是Object的一个方法。等待是一个对象锁。 lock方法不允许继续执行。当notify方法执行完毕后,就会继续执行。 sleep是Thread的一种方法。 sleep 导致线程休眠并放弃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的绘制由3个函数完成。

测量、计算视图的尺寸;

布局,提供视图要显示的位置;

画,画。

6.JNI简介

它是Java和C语言之间的桥梁。由于Java是半解释型语言,并且可以反编译,所以与安全相关的重要代码都是用C编写的。另外,很多底层函数都是调用C语言,用Java实现的。不需要重新发明轮子,所以定义了JNI接口的实现。

7.简述TCP、UDP、Socket

TCP经过三次握手、四次挥手就完成了一串数据的传输。 UDP 是无连接的。你只需要知道IP地址和端口号就可以向其发送数据,而不管数据是否发送成功。

Socket是一种不同计算机之间的实时连接,例如传输文件和即时消息。

8.音视频相关类别

一般来说,分为几类:

视频录制方面,Camear摄像头录制视频类、MediaProjection录屏视频类编码、MediaCodec、MediaRecorder预览、SurfaceView、GLSurfaceView、TextureView、VideoView9。进程和线程的区别

概念:进程包括多个线程、一个程序和一个进程。多线程的优点是可以提高执行效率和资源利用率。

创建:Thread类和Runnable接口;

常用的方法有:

start()用于启动线程 run()调用线程对象中的run方法 join()合并队列到当前线程 sellp()休眠释放cpu资源 setPriority()设置线程优先级 10.如何查看并解决内存泄漏问题

概念:有些对象只有有限的生命周期。当它们的任务完成时,它们将被垃圾收集。如果当对象的生命周期应该结束时,该对象仍然被一系列引用所引用,就会导致内存泄漏。 。

解决方案:使用开源框架LeakCanary有针对性地检测并解决问题。

常见的内存泄漏包括:

单例引起的内存泄漏,例如单例中的Context生命周期大于其自身的Context生命周期;使用 Handers 的线程造成的内存束缚。当 Activity 结束时,线程仍在运行以更新 UI;非静态类使用静态变量,无法回收和释放导致泄漏; WebView页面过多导致内存泄漏;资源没有关闭导致泄漏,比如数据库使用完后关闭连接。 11.视图分配机制、滑动冲突

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(假);

可以完美解决,但是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.匕首2

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

16Android性能优化

布局优化:减少布局层次、使用ViewStub提高显示速度、采取布局、尽量少用warp_content、删除空间中无用的属性、避免过度绘制、去除窗口默认背景、按需显示展台图片、自定义视图优化,使用canvas.clipRect()标识可见区域。

启动速度:采用分布式加载、异步加载、延迟加载来提高应用程序初始化速度、使用线程初始化数据等,以及合理的刷新机制。

内存:防止内存泄漏,使用一些第三方工具检测并解决。

代码优化:遵循 Java 生命周期

安装包优化:删除无用资源、优化图片、代码混淆、避免重复盘点、插件

17.汉德原理

Handler,循环轮询检测发送消息到MessagerQuery,MessageQuery将Message入队,Handler回调方法处理消息,重写handMessage方法刷新UI。

18.如果跨进程使用SharedPreference会发生什么?如何保证跨流程安全使用?

在两个应用程序的清单配置中,使用相同的shartdUserId属性。应用程序A正常保存数据,应用程序B使用createPackageContext("com.netease.nim.demo", CONTEXT_IGNORE_SECURITY)获取上下文,进而获取应用程序数据。为保证数据安全,存储采用加密方式。

19、如何提高推送到达率

判断手机系统,小米使用小米推送,华为使用华为推送,其他手机使用友盟推送。

20、Activity、fragment值传递问题

通过Bundle传递值,在activity中定义变量来传递值,扩展fragment来创建值传递。

21.activity和fragment的区别

生命周期:

一个fragment从创建到销毁的整个生命周期如下:

onAttach()→onCreate()→onCreateView()→onActivityCreated()→onStart()→onResume()→onPause()→onStop()→onDestroyView()→onDestroy()→onDetach()

与活动不同的方法是

onAttach():当Fragment与Activity关联时调用; onCreateView():Fragment创建视图时调用; onActivityCreated:Fragment关联的Activity完成onCreate()后调用; onDestoryView():Fragment中的布局移动分割时调用; onDetach():当Fragment与Activity解除关联时调用;常用的Activity生命周期只有以下几种; onCreate():表示Activity正在创建,常用于初始化工作,如调用setContentView加载界面布局资源等。初始化Activity所需的数据等; onRestart():表示Activity正在重新启动。正常情况下,当当前Activity再次从不可见变为可见时,OnRestart会被调用; onStart():表示Activity正在启动。此时Activity可见但不在前台,仍处于后台,无法与用户交互; onResume():表示该 Activity 已获得焦点。此时,Activity 可见并位于前台,并且已启动 Activity。这就是和onStart的区别; onPause():表示Activity停止。这时,你可以做一些工作,比如存储数据、停止动画等,但不要太耗时,因为这会影响新Activity的显示。必须先执行onPause,然后再执行新Activity的onResume; onStop():表示该Activity即将停止,可以做一些重量级的回收工作,比如注销广播接收器、关闭网络连接等,这些工作应该不会太耗时; onDestroy():表示Activity即将被销毁,是Activity生命周期中的最后一个回调,经常做回收工作和资源释放;

区别:

Fragment比Activity多了4个回调周期,控制操作更加灵活; Fragment可以直接写入xml文件中,也可以在Activity中动态添加; Fragment可以使用show()/hide()或replace()来修改Fragment切换时,切换时不会有明显的效果。 Activity切换时,会有明显的翻页或者其他效果; 22.Fragment中add和replace有什么区别? add 不会重新初始化片段,replace 每次都会这样做;添加相同的fragment时,replace不会改变任何东西,add会报IllegalStateException异常; Replace首先删除所有具有相同ID的片段,然后添加当前片段,而add则覆盖之前的片段。因此,如果使用add,通常会伴随hide()和show(),以避免布局重叠;使用add时,如果应用程序被置于后台或被系统以其他方式销毁,则hide()中引用的fragment在再次打开时将被销毁。因此,布局重叠的bug仍然会发生。使用add时可以使用replace或者添加一个标签参数; 23、FragmentPagerAdapter和FragmentStatePagerAdapter有什么区别和使用场景?

FragmentPagerAdapter的每个Fragment都会持久化在FragmentManager中,只要用户能够返回页面就不会被销毁。因此,适合数据相对静态、Fragments数量相对较少的页面; FragmentStatePagerAdapter 仅保留当前页面。当页面不可见时,Fragment将被淘汰并释放其资源。因此,适合数据动态性较大、占用内存较多、Fragment较多的情况;

24、请介绍一下Activity的四种启动模式以及应用场景? standard 标准模式:每次启动一个Activity时,都会重新创建一个新的实例。无论实例是否已经存在,该模式下的Activity都会默认进入启动它的Activity所属的任务栈; singleTop栈顶复用模式:如果新的Activity已经位于任务栈顶,则不会重新创建该Activity,并且会回调onNewIntent方法。如果新的Activity实例已经存在但不在栈顶,仍然会重新创建该Activity; singleTask栈内复用模式:只要该Activity存在于一个任务栈中,多次启动该Activity就不会重新创建实例,并且会回调onNewIntent方法。当Activity A以这种模式启动时,系统会首先查找A想要的任务栈是否存在。如果不存在,则会重新创建A任务栈,然后将创建的A实例放入栈中; singleInstance单实例模式:这是增强的singleTask模式。这种模式下的Activity只能单独位于一个任务栈中。并且这个任务栈中只有一个实例; 25、说说Activity、window、view之间的关系?

Activity创建时,通过attach()初始化一个Window,即PhoneWindow。 PhoneWindow 包含 DecorView 的实例。 DecorView本身是一个FrameLayout,继承自View。 Activty通过setContentView不断给View添加xml布局控件。最后显示到Window上供我们交互;

26、横竖屏切换时Activity生命周期发生变化?

当Activity的android:configChanges没有设置时,切换屏幕时当前Activity会被销毁,然后重新加载调用各个生命周期。切换横屏时执行一次,切换竖屏时执行两次;

onPause()→onStop()→onDestory()→onCreate()→onStart()→onResume()

设置Activity的android:configChanges="orientation"并通过模型测试

在Android5.1,即API 3 23级别下,每个生命周期在切换屏幕时仍然会被再次调用,并且在切换横屏或竖屏时只会执行一次。

在Android9下,即API 8 28级别,切换屏幕不会重新调用每个生命周期,只会执行onConfigurationChanged方法。

经官方更正后,原话如下

如果您的应用程序面向 Android 2 3.2 即 API 级别 3 13 或更高版本

高级别(根据minSdkVersion和targetSdkVersion)

待续…

面试前系统复习路线

有时候,选择比努力更重要,机会比奋斗更重要。然而,机会只留给有准备的人。只有时刻做好准备,才能在机会到来时抓住机会。

这里我给大家分享一下我的面试复习路线。有需要的朋友可以参考一下:

1.观看视频系统学习

这几年的Crud经历让我明白了自己真的是新手中的战士。正是因为Crud,导致我的技能比较分散,不够深入,不够系统,所以需要重新学习。我缺乏的是系统知识、结构框架和思想,所以通过视频学习更好、更全面。关于视频学习,我个人推荐去B站学习。 B站上有很多学习视频,唯一的缺点是免费的很容易过时。

2、系统梳理知识,提高储备

客户端开发的知识点就这么多,面试问的东西也还是那么几个。所以面试没有什么其他的技巧,只是看你对这些知识点准备得如何。所以,当你出去面试的时候,看看你的复习已经到了什么阶段。

系统学习方向:

架构师打基础必备技能:深入Java泛型+简单的注解+并发编程+数据传输和序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO Android高级UI和FrameWork源码: UI高级推广+框架内核分析+Android组件内核+数据持久化360°全方位性能调优:设计思路与代码质量优化+程序性能优化+开发效率优化解读开源框架设计思路:热修复设计+插件框架解读+组件化框架设计+图像加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack NDK模块开发:NDK基础知识体系+底层图像处理+音视频开发微信小程序:小程序入门+UI开发+API操作+微信对接混合开发与Flutter:Html5项目实践+Flutter进阶

知识整理完毕后,需要查漏补缺。因此,我手头上针对这些知识点准备了很多电子书和笔记。这些笔记完美总结了每个知识点。

3.阅读源码,阅读实践笔记,学习大师的思想。

“编程语言是程序员的表达方式,架构是程序员对世界的感知。”因此,如果程序员想要快速认识和学习架构,阅读源码是必不可少的。阅读源码是解决问题+理解事物,更重要的是:看到源码背后的思想;程序员说:阅读数千行源代码,实现数千种实践。

4. 在面试前夕,快速回答问题

面试前一周内,就可以开始提问冲刺了。请记住,回答问题时,优先考虑技术。算法的话,就看一些基础的,比如排序之类的。智力题一般不会问,除非是校招。

关于面试题,我个人准备了一套系统的面试题,帮助大家举一反三:

以上内容免费分享给大家。需要完整版的朋友可以直接私信转发+点赞+回复【资讯】一键获取! ! !

  • 温馨提示:以上跨进程通信方式、wait 和 sleep 的区别、String 相关类的区别的资讯来自颍上人才网(颍上地区找工作,发布招聘信息的颍上人才网招聘网站),每天更新颍上最新招聘信息。本内容地址:http://www.ysjob.cc/article/articledetail-543.html转载请注明
最新资讯
微信分享

关注微信公众号

访问手机版本