Android-MVP模式详解,附带学习经验_静态receiver mvp模式-程序员宅基地

技术标签: 程序员  android  

前言

马爸爸总结了一句话:跳槽,要么是钱不到位,要么是受了委屈。

我给自己这次的跳槽经历做了一个分析,希望能对那些想换工作的朋友有所帮助。

许多朋友想换工作,但是对“换工作”的理解可能仅限于写简历、投简历、面试。在跳槽之前,我也是这么想的。

当时,工作并不顺利,我的专业技能并没有很好的发挥,公司也给不了什么发展前景,就有了跳槽的打算。

我看到一家行业内还不错的上市公司在招聘这个岗位,于是我发了简历。面试后我感觉很好,但我拒绝了,因为工资没有达到预期。

经过仔细思考,我发现我准备得太匆忙了,或者根本没有准备好。粗糙地写了一份简历,面试前也没有充分的准备,就去了那里。在面试中,项目的一些细节无法得到回答,许多知识点也没有很好的回答,这可能让面试官感觉处于普通水平。

在接下来的几个月里,我开始查阅各种跳槽和面试相关的资料,同时按计划组织重点、整理学习路径,逐步复习。

ANR面试题

1、什么是ANR

Application Not Responding,页面无响应的对话框

2、发生ANR的条件

应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当ANR发生条件满足时,就会弹出ANR的对话框

  • Activity超过5秒无响应
  • BroadcastReceiver超过10秒无响应
  • Service超过20秒无响应

3、造成ANR的主要原因

主线程被IO操作阻塞

  • Activity的所有生命周期回调都是执行在主线程的
  • Service默认执行在主线程中
  • BoardcastReceiver的回调onReceive()执行在主线程中
  • AsyncTask的回调除了doInBackground,其他都是在主线程中
  • 没有使用子线程Looper的Handler的handlerMessage,post(Runnable)都是执行在主线程中

4、如何解决ANR

  • 使用AsyncTask处理耗时IO操作
  • 使用Thread或HandlerThread提供优先级
  • 使用Handler处理工作线程的耗时操作
  • Activity的onCreate和onResume回调尽量避免耗时操作

OOM面试题

1、什么是OOM

OOM指Out of memory(内存溢出),当前占用内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out of memory异常

2、OOM相关概念

  • 内存溢出:指程序在申请内存时,没有足够的空间供其使用
  • 内存泄漏:指程序分配出去的内存不再使用,无法进行回收
  • 内存抖动:指程序短时间内大量创建对象,然后回收的现象

3、解决OOM

Bitmap相关

  • 图片压缩
  • 加载缩略图
  • 在滚动时不加载图片
  • 回收Bitmap
  • 使用inBitmap属性
  • 捕获异常

其他相关

  • listview重用convertView、使用lru
  • 避免onDraw方法执行对象的创建
  • 谨慎使用多进程

Bitmap面试题

1、recycle

  • 在安卓3.0以前Bitmap是存放在堆中的,我们只要回收堆内存即可

  • 在安卓3.0以后Bitmap是存放在内存中的,我们需要回收native层和Java层的内存

  • 官方建议我们3.0以后使用recycle方法进行回收,该方法也可以不主动调用,因为垃圾回收器会自动收集不可用的Bitmap对象进行回收

  • recycle方法会判断Bitmap在不可用的情况下,将发送指令到垃圾回收器,让其回收native层和Java层的内存,则Bitmap进入dead状态

  • recycle方法是不可逆的,如果再次调用getPixels()等方法,则获取不到想要的结果

2、LruCache原理

LruCache是个泛型类,内部采用LinkedHashMap来实现缓存机制,它提供get方法和put方法来获取缓存和添加缓存,其最重要的方法trimToSize是用来移除最少使用的缓存和使用最久的缓存,并添加最新的缓存到队列中

UI卡顿面试题

1、UI卡顿原理

View的绘制帧数保持60fps是最佳,这要求每帧的绘制时间不超过16ms(1000/60),如果安卓不能在16ms内完成界面的渲染,那么就会出现卡顿现象

2、UI卡顿的原因分析

  • 在UI线程中做轻微的耗时操作,导致UI线程卡顿
  • 布局Layout过于复杂,无法在16ms内完成渲染
  • 同一时间动画执行的次数过多,导致CPU和GPU负载过重
  • overDraw,导致像素在同一帧的时间内被绘制多次,使CPU和GPU负载过重
  • View频繁的触发measure、layout,导致measure、layout累计耗时过多和整个View频繁的重新渲染
  • 频繁的触发GC操作导致线程暂停,会使得安卓系统在16ms内无法完成绘制
  • 冗余资源及逻辑等导致加载和执行缓慢
  • ANR

3、UI卡顿的优化

  • 布局优化
  • 使用include、ViewStub、merge
  • 不要出现过于嵌套和冗余的布局
  • 使用自定义View取代复杂的View
  • ListView优化
  • 复用convertView
  • 滑动不加载
  • 背景和图片优化
  • 缩略图
  • 图片压缩
  • 避免ANR
  • 不要在UI线程中做耗时操作

内存泄漏面试题

1、Java内存泄漏引起的主要原因

长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏

2、Java内存分配策略

  • 静态存储区:又称方法区,主要存储全局变量和静态变量,在整个程序运行期间都存在

  • 栈区:方法体的局部变量会在栈区创建空间,并在方法执行结束后会自动释放变量的空间和内存

  • 堆区:保存动态产生的数据,如:new出来的对象和数组,在不使用的时候由Java回收器自动回收

3、Android解决内存泄漏的例子

  • 单例造成的内存泄漏:在单例中,使用context.getApplicationContext()作为单例的context

  • 匿名内部类造成的内存泄漏:由于非静态内部类持有匿名外部类的引用,必须将内部类设置为static

  • Handler造成的内存泄漏:使用static的Handler内部类,同时在实现内部类中持有Context的弱引用

  • 避免使用static变量:由于static变量会跟Activity生命周期一致,当Activity退出后台被后台回收时,static变量是不安全,所以也要管理好static变量的生命周期

  • 资源未关闭造成的内存泄漏:比如Socket、Broadcast、Cursor、Bitmap、ListView等,使用完后要关闭

  • AsyncTask造成的内存泄漏:由于非静态内部类持有匿名内部类的引用而造成内存泄漏,可以通过AsyncTask内部持有外部Activity的弱引用同时改为静态内部类或在onDestroy()中执行AsyncTask.cancel()进行修复

内存管理面试题

1、Android内存管理机制

  • 分配机制
  • 管理机制

2、内存管理机制的特点

  • 更少的占用内存
  • 在合适的时候,合理的释放系统资源
  • 在系统内存紧张的时候,能释放掉大部分不重要的资源
  • 能合理的在特殊生命周期中,保存或还原重要数据

3、内存优化方法

  • Service完成任务后应停止它,或用IntentService(因为可以自动停止服务)代替Service
  • 在UI不可见的时候,释放其UI资源
  • 在系统内存紧张的时候,尽可能多的释放非重要资源
  • 避免滥用Bitmap导致内存浪费
  • 避免使用依赖注入框架
  • 使用针对内存优化过的数据容器
  • 使用ZIP对齐的APK
  • 使用多进程

冷启动和热启动面试题

1、什么是冷启动和热启动

  • 冷启动:在启动应用前,系统中没有该应用的任何进程信息
  • 热启动:在启动应用时,在已有的进程上启动应用(用户使用返回键退出应用,然后马上又重新启动应用)

2、冷启动和热启动的区别

  • 冷启动:创建Application后再创建和初始化MainActivity
  • 热启动:创建和初始化MainActivity即可

3、冷启动时间的计算

这个时间值从应用启动(创建进程)开始计算,到完成视图的第一次绘制为止

4、冷启动流程

  • Zygote进程中fork创建出一个新的进程
  • 创建和初始化Application类、创建MainActivity
  • inflate布局、当onCreate/onStart/onResume方法都走完
  • contentView的measure/layout/draw显示在界面上

总结:Application构造方法->attachBaseContext()->onCreate()->Activity构造方法->onCreate()->配置主题中背景等属性->onStart()->onResume()->测量布局绘制显示在界面上

5、冷启动优化

  • 减少第一个界面onCreate()方法的工作量
  • 不要让Application参与业务的操作
  • 不要在Application进行耗时操作
  • 不要以静态变量的方式在Application中保存数据
  • 减少布局的复杂性和深度
  • 不要在mainThread中加载资源
  • 通过懒加载方式初始化第三方SDK

其他优化面试题

1、Android不用静态变量存储数据

  • 静态变量等数据由于进程已经被杀死而被初始化
  • 使用其他数据传输方式:文件/sp/contentProvider

2、SharePreference安全问题

  • 不能跨进程同步
  • 文件不宜过大

3、内存对象序列化

  • Serializeble:是java的序列化方式,Serializeble在序列化的时候会产生大量的临时对象,从而引起频繁的GC

  • Parcelable:是Android的序列化方式,且性能比Serializeble高,Parcelable不能使用在要将数据存储在硬盘上的情况

4、避免在UI线程中做繁重的操作

架构模式面试题

插件化面试题

1、插件化解决的问题

  • 动态加载APK(反射、类加载器)
  • 资源加载(反射、AssetManager、独立资源、分段资源)
  • 代码加载(反射获取生命周期)

2、类加载器(Java中字节码添加到虚拟机中)

  • DexClassLoader:能够加载未安装的jar/apk/dex,主要用于动态加载和代码热更新
  • PathClassLoader:只能加载系统中已经安装过的apk

热更新面试题

1、热更新主要流程

  • 线上检查到Crash
  • 拉出Bugfix分支修复Crash问题
  • jenkins构建和补丁生成
  • app通过推送或主动拉取补丁文件
  • 将Bugfix代码合到master上

2、热更新主流框架

  • Dexposed
  • AndFix
  • Nuwa
  • Tinker

3、热更新的原理

  • 在ClassLoader创建一个dexElements数组
  • 将修复好的dex文件存放在dexElements数组的最前面
  • ClassLoader会遍历dexElements数组,找到最前面的dex文件优先加载

进程保活面试题

1、进程的优先级

  • 空进程
  • 后台进程
  • 服务进程
  • 可见进程
  • 前台进程

2、Android进程回收策略

  • Low memory Killer(定时执行):通过一些比较复杂的评分机制,对进程进行打分,然后将分数高的进程判定为bad进程,杀死并释放内存

  • OOM_ODJ:判别进程的优先级

3、Android保活方案

  • 利用系统广播拉活
  • 利用系统Service机制拉活
  • 利用Native进程拉活
  • 利用JobScheduler机制拉活
  • 利用账号同步机制拉活

Lint面试题

1、什么是Android Lint

Android Lint是一个静态代码分析工具,它能够对你的Android项目中潜在的Bug、可优化的代码、安全性、性能、可用性、可访问性、国际化等进行检查

2、Lint工作流程

3、配置Lint

  • 创建Lint.xml到根目录下,自定义Lint安全等级等
  • 在Java文件中可以使用@suppressLint(“NewApi”)来忽视Lint的报错
  • 在xml文件中可以使用tool:ignore(“UnusedResources”)来忽视Lint的报错
  • 自定义Lint检查,可以创建类,继承Detector和实现JavaPsiScanner

Kotlin面试题

1、什么是Kotlin

  • Kotlin是一种基于JVM的编程语言
  • 对Java的一种拓展,比Java更简洁
  • Kotlin支持函数式编程
  • Kotlin类和Java类可以相互调用

2、Kotlin环境搭建

  • 直接在Plugin中下载Kotlin插件即可
  • 系统会自动配置到Kotlin环境

总结:

各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。

  • 点击此处,与我们一起交流学习
  • BAT大厂面试题、独家面试工具包,

  • 资料免费领取,包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter

行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。

  • 点击此处,与我们一起交流学习
  • BAT大厂面试题、独家面试工具包,

  • 资料免费领取,包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter
    [外链图片转存中…(img-Foqn9NwL-1616417563688)]

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_56130999/article/details/115097924

智能推荐

OpenStack之keystone(身份认证服务)_openstack中最重要的身份服务是什么?是如何运作的?-程序员宅基地

文章浏览阅读5.3k次。keystone概述概念Keystone (OpenStack ldentity Service)是OpenStack中的一个独立的提供安全认证的模块,主要负责openstack用户的身份认证、令牌管理、提供访问资源的服务目录、以及基于用户角色的访问控制。Keystone类似一个服务总线,或者说是整个Openstack框架的注册表,其他服务通过keystone来注册其服务的Endpoint(服务访问的URL),任何服务之间相互的调用,需要经过Keystone的身份验证,来获得目标服务的Endpoi_openstack中最重要的身份服务是什么?是如何运作的?

Vuejs2.0开发仿QQ音乐webpp案例分析-程序员宅基地

文章浏览阅读2.1k次。仿QQ音乐webapp是基于Vue2.0,vuex,vue-router,axios和html5的flexible box布局与及css3的transform,animation,transition组成。Vuejs是一套MVVM框架,主要注重于view层,实现数据双向绑定与及虚拟DOM,解放你的双手,让你不用直接和真实的DOM进行操作,只要数据改变,vue自动检查DOM结构不同,更新DOM元素..._webpp

实现多模交互融合的四个阶段-程序员宅基地

文章浏览阅读2.9k次。多模交互融合是普适计算和自然交互中最重要的组成部分。笔者认为,实现完整的多模交互融合需要分成四个阶段,分别为独立工作阶段、初步融合阶段、语义理解阶段和任务自适应阶段。01独立工作阶段各自..._多模态融合阶段

C++设计模式-建造者模式-程序员宅基地

文章浏览阅读5.2k次,点赞23次,收藏25次。目录基本概念代码与实例基本概念建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们装配方式时适用的模式。下面给出一个UML实例:代码与实例程序运行截图如下:源码如下:Head.h#include ..._建造者模式

苹果手机怎么录屏 苹果录屏方法步骤详解-程序员宅基地

文章浏览阅读1.3w次。苹果手机使用的是ios苹果系统,在操作上与传统的安卓手机相比会有一定差异,因此一些刚使用苹果手机的网友会不清楚一些基础功能的使用方法,比如苹果手机录屏等。2、需要录屏的时候直接打开控制中心,点击屏幕录制图标,倒计时3秒之后开始录屏,想要结束录屏直接点击左上方的红色区域,然后点击停止即可,录制的视频就自动保存到相册中了。我们还可以使用第三方的工具进行苹果手机录屏,而且体验更多更丰富的功能。3、这些都设置好之后就可以开始录屏,在录屏开始前可以开启摇一摇结束录屏的功能,想要结束录屏的时候只需要晃动手机就可以。_苹果手机怎么录屏

error: resource android:attr/fontVariationSettings not found. (flutter项目解决方案)-程序员宅基地

文章浏览阅读3.1k次。原因:是编译的targer SDK版本过低(support v7-28.0.0会包这个问题)纯android项目只需要修改build.gradle中 compileSdkVersion 版本>=28。flutter项目,稍微有些不一样。flutter用的一些插件有些compileSdkVersion需要单独改。这是我的错误,如下:FAILURE: Build failed with an exception. ..._error: resource android:attr/fontvariationsettings not found.

随便推点

微软Windows操作系统全面兼容机器人操作系统ROS1和ROS2_ros2_java for windows-程序员宅基地

文章浏览阅读7.4k次,点赞4次,收藏10次。微软Windows操作系统全面兼容机器人操作系统ROS1和ROS2turtlebot2:https://github.com/bfjelds/turtlebot2-win10文档:https://libraries.io/github/bfjelds/turtlebot2-win10安装在/opt/ros/melodic/x64文件夹下,依据如下教程即可安装成功。ROS..._ros2_java for windows

qt 子窗口向父窗口发送信息_qt中对话框返回信息给父页面-程序员宅基地

文章浏览阅读4.3k次,点赞7次,收藏20次。场景:点击父窗口按钮1,弹出子窗口。点击子窗口查询按钮,隐藏子窗口并把查询结果显示在父窗口上。参考文献Qt实例–主窗口和子窗口互发信号简化需求为:子窗口点击按钮,向父窗口发送消息,并显示在子窗口上:子窗口 DatasetQueryConditionWgt.h要定义两个函数:点击按钮,发送信号的槽函数SlotQueryBtnClicked(),注意带上slots发送信息的函数 SignalQueryConditionBtnClicked(QVariantMap m_queryCondition)_qt中对话框返回信息给父页面

Makefile and Paul's Rules of Makefiles_suffix rules are obsolete: .c.o-程序员宅基地

文章浏览阅读546次。Defining and Redefining Pattern Rules_suffix rules are obsolete: .c.o

Retrofit2+Okhttp3添加统一请求体_retrofit 设置请求体-程序员宅基地

文章浏览阅读941次。前言上篇讲到Retrofit2+Okhttp3添加统一请求头,这篇是添加统一请求体,原理是相通的,把参数以请求体的方式添加到拦截器中,然后在配置给okhttp。 代码实现创建拦截器,并添加参数public class HeaderInterceptor implements Interceptor { @NonNull @Override public Re..._retrofit 设置请求体

mysql删除表中指定数据,delete from..where-程序员宅基地

文章浏览阅读2.4k次。mysql -uxx -pyyyselect count(id) from lottery.mop_bet_order_history where created_at < '2015-11-01' and created_at > '2015-10-01';delete from lottery.mop_hot_history where cre..._delete from where created_at < '2024-02-01';

gradle settings use local gradle(设置gradle版本为本地版本)-程序员宅基地

文章浏览阅读5.8k次。下面过程说明了“android studio如何设置gradle版本为本地版本”:1. 打开File->Settings;2. 选择Build,Execution,Deployment->Gradle;3. 再选择右边的Project level settings ,选中use local gradle,在Gradle Home的右边,选择本地gradle的目录。最后,点击OK即可_use local gradle

推荐文章

热门文章

相关标签