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

智能推荐

openPLC armhf架构 Ubuntu根文件系统制作过程记录-程序员宅基地

文章浏览阅读554次,点赞8次,收藏14次。1.3 DNS 配置文件/etc/resolv.conf。1.4 制作文件系统挂载脚本ch-mount.sh。3.配置网口自动dhcp并开启eth0问题。使用时把https 改成 http。4.清华 armhf 架构软件源地址。1. ubuntu 根文件系统下载。1.6 跟换源 清华 port 源。2.配置串口,解决登录输入无效问题。使用时把https 改成 http。1.9 设置本机名称和IP地址。1.2 安装qemu模拟器。1.7 下载所需软件包。1.5 挂载文件系统。5.U盘挂载修复问题。

nodejs express使用node-xlsx实现文件的上传下载导入导出_express批量导入excel-程序员宅基地

文章浏览阅读1.2k次。在express项目中使用node-xlsx实现文件导入导出npm install node-xlsx --save1. 上传app.jsconst multer = require('multer')app.use(multer({dest: './uploads'}).any())后端接口:const path = require("path")const fs = require('fs');const xlsx = require('node-xlsx');// 接口ro_express批量导入excel

python实现登录验证系统(搭建MVC框架)_python实现验证码登陆-程序员宅基地

文章浏览阅读3.5k次。小型登录注册验证系统一、概述​ 使用Redis+MySQL数据库实现一个小型的登录注册验证系统。在这个系统中初步了解认识MVC框架。​ 具备功能:登录、注册、改密、注销。​ 数据库:Redis,MySQL。​ 开发语言:Python。​ MVC框架:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器..._python实现验证码登陆

解决方案:秒杀整体设计-程序员宅基地

文章浏览阅读196次,点赞2次,收藏2次。解决方案:秒杀整体设计秒杀技术实现核心思想是:运用缓存减少数据库瞬间的访问压力读取商品详细信息:运用缓存,当用户点击抢购时减少缓存中的库存数量,当库存数为0时或活动期结束时,同步到数据库产生的秒杀预订单:也不会立刻写到数据库中,而是先写到缓存,当用户付款成功后再写入数据库1. 秒杀商品压入Redis缓存秒杀由B端存入MYSQL,设置定时任务,每隔一段时间就从MYSQL中将符合条件的数据从MYSQL中查询出来并存入缓存中,redis以Hash类型进行数据存储(namespace=时间,key=商

作品展示1——仿QQ即时通讯软件_visual studio模仿 qq 完成一套即时通信软件。-程序员宅基地

文章浏览阅读1.6k次。仿QQ即时通讯软件前要说明: 编程环境:Window7/WinXP、Visual C++6.0 软件分客户端、服务器、数据库三块。其中,服务器和数据库整合在单机上了。====================================================客户端登录界面:=======================================================客户端主界面:(最大化与正常窗体)===================_visual studio模仿 qq 完成一套即时通信软件。

can't return outside function or method解决方法_return outside method-程序员宅基地

文章浏览阅读4.5k次。今天写web项目作业时,发现jsp中“Cannot return from outside a function or method” 提示return出错,百度了一下,网上说这是myeclipse的一个bug,去掉return就好了,去掉之后果然不报错,但是之后发现onSubmit()不能阻止表单提交,再百度之,原来这个return还真不能去掉。以下就是今天错误的解决方法 1_return outside method

随便推点

java用那个软件编,java编译软件 编写java程序用什么软件?-程序员宅基地

文章浏览阅读9.7k次,点赞3次,收藏22次。其实装了JDK就可以做JAVA程序了,但要用文本编辑器之类的东西写程序的源代码,用JDK进行调试运行。适合初学者。当有了一定的经验以后你可以选择集成的JAVA编译器,如JCreator,eclipse。JCreator也适合初学者,因为靠近底层。现在企业开发软件最多用的就是eclipse,因为他是开源的,而且本身就是用JAVA编写的,所以兼容性更好。java用什么编译软件用JCreator或ecl..._java用什么软件编写

通过密钥远程登录(SSH)Kali(linux)_kali开启ssh秘钥登录-程序员宅基地

文章浏览阅读346次。密钥、远程登录(SSH)Kali(linux)_kali开启ssh秘钥登录

QtCreator如何进行Qt开源程序包的源码调试_qt debug information file-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏8次。如果用vs2019的话,这个不是问题,vs会时不时的问源程序在哪里呀,你打开一下呀之类的。但用QtCreator这家伙的话,基本上默认状态下就是不闻不问。首先,我假设你下载了安装程序 ,3D进阶之OSG: 编译osgQt(附:Qt的下载与安装)_高精度计算机视觉的博客-程序员宅基地_osg编译osgQt是个简单的小项目,其实没有必要额外的编译,最核心的是个名为GraphicsWindowQt的类,只需要复制GraphicsWindowQt.h和GraphicsWindowQt.cpp到QT工程里面就_qt debug information file

Promise in AngularJS-程序员宅基地

文章浏览阅读1.8k次。What's promiseAngular’s event system provides a lot of power to our Angular apps. One of the most powerful features that it enables is automatic resolution of promises.Promises are a method of

android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity_android android.util.androidruntimeexception: call-程序员宅基地

文章浏览阅读741次。android.util.AndroidRuntimeException: Calling startActivity() from outside of an ActivityCaused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity contex_android android.util.androidruntimeexception: calling startactivity() from o

集群资源调度系统设计架构总结_任务调度集群资源怎么写-程序员宅基地

文章浏览阅读5.9k次,点赞3次,收藏17次。集群资源调度系统设计架构总结之前为完成《AWS 下 Kylin 调度系统的设计》(https://io-meter.com/2017/10/13/kylin-aws-scheduler-system/),阅读了大量 集群资源管理和任务调度的资料和论文。了解了如Hadoop YARN、Mesos、Spark Drizzle、Borg/Kubernetes 和O mega等系统的调度器_任务调度集群资源怎么写

推荐文章

热门文章

相关标签