首页
学习
活动
专区
工具
TVP
发布

深入理解Android

专栏作者
345
文章
182563
阅读量
38
订阅数
leetcode刷题(132)——完全背包问题思路理解
有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。
老马的编程之旅
2022-11-21
2961
leetcode刷题(131)——背包问题理解
有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
老马的编程之旅
2022-11-21
3830
leetcode刷题(130)——最大得分的路径数目
你的目标是到达数组最左上角的字符 ‘E’ ,数组剩余的部分为数字字符 1, 2, …, 9 或者障碍 ‘X’。在每一步移动中,你可以向上、向左或者左上方移动,可以移动的前提是到达的格子没有障碍。
老马的编程之旅
2022-11-18
1850
leetcode刷题(129)——576. 出界的路径数
给你一个大小为 m x n 的网格和一个球。球的起始坐标为 [startRow, startColumn] 。你可以将球移到在四个方向上相邻的单元格内(可以穿过网格边界到达网格之外)。你 最多 可以移动 maxMove 次球。
老马的编程之旅
2022-11-16
1920
leetcode刷题(128)——1575. 统计所有可行路径,动态规划解法
给你一个 互不相同 的整数数组,其中 locations[i] 表示第 i 个城市的位置。同时给你 start,finish 和 fuel 分别表示出发城市、目的地城市和你初始拥有的汽油总量
老马的编程之旅
2022-11-16
2330
leetcode刷题(127)——1575. 统计所有可行路径
给你一个 互不相同 的整数数组,其中 locations[i] 表示第 i 个城市的位置。同时给你 start,finish 和 fuel 分别表示出发城市、目的地城市和你初始拥有的汽油总量
老马的编程之旅
2022-11-16
2040
leetcode刷题(126)——1289. 下降路径最小和 II
给你一个 n x n 整数矩阵 arr ,请你返回 非零偏移下降路径 数字和的最小值。
老马的编程之旅
2022-11-16
3230
leetcode刷题(125)——931. 下降路径最小和
给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。
老马的编程之旅
2022-11-16
2720
leetcode刷题(124)——64. 最小路径和
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
老马的编程之旅
2022-11-14
1530
leetcode刷题(123)——63. 不同路径 II
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
老马的编程之旅
2022-11-14
1490
leetcode刷题(122)——62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
老马的编程之旅
2022-11-14
2410
Android面试每日一题(6):BroadcastReceiver 与 LocalBroadcastReceiver 有什么区别?
广播细分为三种: 普通广播 有序广播 本地广播 普通广播是什么? 调用sendBroadcast()发送 有序广播是什么? 调用sendOrderedBroadcast()发送 广播接收者会
老马的编程之旅
2022-09-22
4760
Android面试每日一题(5):抽象类与接口的区别?
抽象类可以提供成员方法的实现细节,而接口中只能存在 public 抽象方法; 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的; 接口中不能含有构造器、静态代码块以及静态方法,而抽象类可以有构造器、静态代码块和静态方法; 一个类只能继承一个抽象类,而一个类却可以实现多个接口; 抽象类访问速度比接口速度要快,因为接口需要时间去寻找在类中具体实现的方法; 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。如果你往接口中添加方法,那么你必须改变实现该接口的类。 接口更多的为了约束类的行为,可用于解耦,而抽象类更加侧重于代码复用。
老马的编程之旅
2022-09-22
2090
Android面试每日一题(4): 哪些情况下会导致oom问题?
1、根据java的内存模型会出现内存溢出的内存有堆内存、方法区内存、虚拟机栈内存、native方法区内存; 2、一般说的OOM基本都是针对堆内存; 3、对于堆内存溢出主的根本原因有两种 (1)app进程内存达到上限 (2)手机可用内存不足,这种情况并不是我们app消耗了很多内存,而是整个手机内存不足 4、而我们需要解决的主要是app的内存达到上限 5、对于app内存达到上限只有两种情况 (1)申请内存的速度超出gc释放内存的速度 (2)内存出现泄漏,gc无法回收泄漏的内存,导致可用内存越来越少 6、对于申请内存速度超出gc释放内存的速度主要有2种情况 (1)往内存中加载超大文件 (2)循环创建大量对象 7、一般申请内存的速度超出gc释放内存基本不会出现,内存泄漏才是出现问题的关键所在 8、内存泄漏常见场景 (1)资源对象没关闭造成的内存泄漏(如: Cursor、File等) (2)全局集合类强引用没清理造成的内存泄漏(特别是 static 修饰的集合) (3)接收器、监听器注册没取消造成的内存泄漏,如广播,eventsbus (4)Activity 的 Context 造成的泄漏,可以使用 ApplicationContext (5)单例中的static成员间接或直接持有了activity的引用 (6)非静态内部类持有父类的引用,如非静态handler持有activity的引用 9、怎么对内存进行优化呢 三个方向 (1)为应用申请更大内存,把manifest上的largdgeheap设置为true (2)减少内存的使用 ①使用优化后的集合对象,比如SpaseArray; ②使用微信的mmkv替代sharedpreference; ③对于经常打log的地方使用StringBuilder来组拼,替代String拼接 ④统一带有缓存的基础库,特别是图片库,如果用了两套不一样的图片加载库就会出现2个图片各自维护一套图片缓存 ⑤给ImageView设置合适尺寸的图片,列表页显示缩略图,查看大图显示原图 ⑥优化业务架构设计,比如省市区数据分批加载,需要加载省就加载省,需要加载市就加载失去,避免一下子加载所有数据 (3)避免内存泄漏 编码规范上: ①资源对象用完一定要关闭,最好加finally ②静态集合对象用完要清理 ③接收器、监听器使用时候注册和取消成对出现 ④context使用注意生命周期,如果是静态类引用直接用ApplicationContext ⑤使用静态内部类 ⑥结合业务场景,设置软引用,弱引用,确保对象可以在合适的时机回收 建设内存监控体系: 线下监控: ①使用ArtHook检测图片尺寸是否超出imageview自身宽高的2倍 ②编码阶段Memery Profile看app的内存使用情况,是否存在内存抖动,内存泄漏,结合Mat分析内存泄漏 线上监控: ①上报app使用期间待机内存、重点模块内存、OOM率 ②上报整体及重点模块的GC次数,GC时间 ③使用LeakCannery自动化内存泄漏分析 10、真的出现低内存,设置一个兜底策略 低内存状态回调,根据不同的内存等级做一些事情,比如在最严重的等级清空所有的bitmap,关掉所有界面,直接强制把app跳转到主界面,相当于app重新启动了一次一样,这样就避免了系统Kill应用进程,与其让系统kill进程还不如浪费一些用户体验,自己主动回收内存
老马的编程之旅
2022-09-21
5250
Android面试每日一题(3): LaunchMode 的应用场景?
LaunchMode 有四种,分别为 Standard,SingleTop,SingleTask 和 SingleInstance,每种模式的实现原理一楼都做了较详细说明,下面说一下具体使用场景:
老马的编程之旅
2022-09-21
5160
Android面试每日一题(2): 一般什么情况下会导致内存泄漏问题?
1、内存泄漏的根本原因在于生命周期长的对象持有了生命周期短的对象的引用 2、常见场景 (1)资源对象没关闭造成的内存泄漏(如: Cursor、File等) (2)全局集合类强引用没清理造成的内存泄漏(特别是 static 修饰的集合) (3)接收器、监听器注册没取消造成的内存泄漏,如广播,eventsbus (4)Activity 的 Context 造成的泄漏,可以使用 ApplicationContext (5)单例中的static成员间接或直接持有了activity的引用 (6)非静态内部类持有父类的引用,如非静态handler持有activity的引用 3、如何避免内存泄漏 (1)编码规范上: ①资源对象用完一定要关闭,最好加finally ②静态集合对象用完要清理 ③接收器、监听器使用时候注册和取消成对出现 ④context使用注意生命周期,如果是静态类引用直接用ApplicationContext ⑤使用静态内部类 ⑥结合业务场景,设置软引用,弱引用,确保对象可以在合适的时机回收 (2)建设内存监控体系 线下监控: ①使用ArtHook检测图片尺寸是否超出imageview自身宽高的2倍 ②编码阶段Memery Profile看app的内存使用情况,是否存在内存抖动,内存泄漏,结合Mat分析内存泄漏 线上监控: ①上报app使用期间待机内存、重点模块内存、OOM率 ②上报整体及重点模块的GC次数,GC时间 ③使用LeakCannery自动化内存泄漏分析 总结: 上线前重点在于线下监控,把问题在上线前解决;上线后运营阶段重点做线上监控,结合一定的预警策略及时处理 4、真的出现低内存,设置一个兜底策略 低内存状态回调,根据不同的内存等级做一些事情,比如在最严重的等级清空所有的bitmap,关掉所有界面,直接强制把app跳转到主界面,相当于app重新启动了一次一样,这样就避免了
老马的编程之旅
2022-09-21
4110
Android面试每日一题: Handler 如何有效地避免内存泄漏问题
在Android系统中,Handler是一个消息发送和处理机制的核心组件之一,与之配套的其他主要组件还有Looper和Message,MessageQueue。 Message和Runnable类是消息的载体。MessageQueue是消息等待的队列。Looper则负责从队列中取消息。
老马的编程之旅
2022-09-21
6571
Android Framework分析(3)——Zygote进程源码分析
zygote由java编写而成,不能直接由init进程启动运行。若想执行zygote类,必须先创建虚拟机,然后在虚拟机上运行ZygoteInit类。执行这一任务的就是app_process程序。 下面我们开始分析zygote进程的启动流程: /system/core/rootdir/init.rc
老马的编程之旅
2022-06-23
9300
Android framework学习(2)——Handler Native层
基于android28源码,MessageQueue类里面涉及到多个native方法,除了MessageQueue的native方法,native层本身也有一套完整的消息机制,用于处理native的消息,如下图Native层的消息机制。
老马的编程之旅
2022-06-23
5630
Android Framework分析(1)-init
init进程是Linux系统中用户空间的第一个进程,进程号固定为1。Kernel启动后,在用户空间启动init进程,并调用init中的main()方法执行init进程的职责。对于init进程的功能分为4部分:
老马的编程之旅
2022-06-23
8390
点击加载更多
社区活动
腾讯技术创作狂欢月
“码”上创作 21 天,分 10000 元奖品池!
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档