- 博客(14)
- 收藏
- 关注
原创 【Android食用指南-01】Android虚拟机&类加载机制
前言在上一篇文章中【JVM入门食用指南-03】JVM垃圾回收器以及性能调优[1],对垃圾回收器以及JVM性能调优进行了叙述,并对JVM中CMS垃圾回收器进行了重点阐述。通过之前在JVM中的铺垫,本文我们回到Android中,本文我们主要对Android虚拟机和类加载机制进行叙述,加深对 Android 的理解。即将学会ART 和 Dalvik Android 类加载流程 热修复实现原理ART 与 DalvikJVM 与 DVMJVM 是我们的 Java 虚拟机,而我们的Andro.
2021-08-31 21:07:24 899 3
原创 字节面试题: Kotlin 中处理生产者/消费者问题的 N 种方式?
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个缓冲区(Buffer),生产者往 Buffer 中添加产品,消费者从 Buffer 中取走产品,当 Buffer 为空时,消费者阻塞,当 Buffer 满时,生产者阻塞。Kotlin 中有多种方法可以实现多线程的生产/消费模型(大多也适用于Java)Synchronized ReentrantLock BlockingQueue Semaphore PipedXXXStream RxJava Coroutin
2021-08-29 22:19:40 2926 6
原创 Android开发者重读设计模式:写个上传解耦库练练手
上周总算是把设计模式之美看完了,一直想写个东西练练手,碰巧最近要重构公司的上传库,所以有了这篇文章。(仅仅是学习练手,有建议可以提,架构大佬轻喷)0x1、杂谈① 为什么要重构上传库?我司APP在上传图片/视频前,需要进行一系列处理,最后才上传,如:图片:判断路径是否存在 → 通过Exif信息判断是否需要旋转 → 判断是否需要压缩 → 获取MD5 → 如果开启秒传查询是否有秒传记录,有直接返回 → 没有才上传 → 上传完成对应状态更新; 视频:判断路径是否存在 → 判断是否需要压缩 → 要压
2021-08-27 13:54:13 253 1
原创 Jetpack Compose 自定义绘制
概述Jetpack Compose 作为一款 UI 框架,自定义绘制部分是必不可少的。通过官方所提供的基础 API, 允许开发者实现各种场景下的绘制定制需求。如果你对 Android 原生 Canvas 已经了如指掌的话,那么迁移至 Jetpack Compose 基本没有任何成本。即使你不曾了解 Android 原生 Canvas 也不要担心,阅读这篇文章你同样也可以掌握如何在 Jetpack Compose 完成自定义绘制。从 Canvas Composable 开始Canvas Compo
2021-08-25 20:54:22 1299 2
原创 Android 模块化开发实践
一、前言随着业务的快速发展,现在的互联网App越来越大,为了提高团队开发效率,模块化开发已经成为主流的开发模式。正好最近完成了vivo官网App业务模块化改造的工作,所以本文就对模块化开发模式进行一次全面的介绍,并总结模块化改造经验,帮助兄弟项目避坑。二、什么是模块化开发首先我们搞清两个概念,Android客户端开发目前有两种模式:单工程开发模式和模块化开发模式。 单工程开发模式:早期业务少、开发人员也少,一个App对应一个代码工程,所有的代码都集中在这一个工程的一个module里。
2021-08-25 16:36:10 229 3
原创 Android 进阶之路:ASM 修改字节码,这样学就对了!
看了很多 ASM 入门的文章,都感觉文章写的很轻松,站立的高度都太高了,我个人觉得想要能够编写 ASM 相关代码,能看懂字节码是必不可少的,所以本文会以字节码为切入点,带大家简单的入门一下 ASM。Java Class 文件结构大家都知道*.java 文件经过 javac 编译之后会生成 *.class 文件,*.class 文件会被 Java 虚拟机进行加载。Java 虚拟机之所有能够加载class 文件,前提肯定是能够按照某种规则读取 class 文件的内容。那么这个规则就是*.clas
2021-08-24 14:39:47 983 2
原创 Android 内存、I/O、网络、存储的优化实践
一 内存优化1.1 内存模型与分布上图是常见的java虚拟机的内存分布图: 方法区:主要存储虚拟机加载的类信息,常量,静态变量,及时编译器编译后的代码等数据。内存优化时这一部分主要考虑是不是加载了很多不必要的第三方库。这部分的内存减少主要是常量池的回收和类的卸载(类卸载条件:无引用,类加载器可卸载)。 堆:几乎所有的对象都在这个区域产生,该区域属于线程共享的区域,所以写代码时更要注意多线程安全。这个内存区域的大小变化主要是对象的创建和回收,比如:如果短时间内有大量的对象创建和回收
2021-08-23 17:10:23 693 4
原创 RecyclerView 添加分割线,ItemDecoration 的实用技巧
我的理解:ItemDecoration 允许我们给 recyclerview 中的 item 添加专门的绘制和布局;比如分割线、强调和装饰等等。默认 recyclerview 的表现像下面这样其实我想要的是这样如果我们不使用这个的话,那么我们在编写 xml 文件的时候只能添加 layout_margin 这样的值,而且即便这样在有些场景下也是不好用的。其实也没关系我们可以使用代码控制,比如在 onBindViewHolder 中根据数据的位置写对应的逻辑,像我上面那种我需要把最后一个.
2021-08-22 20:24:26 621
原创 Android 金九银十面试准备进行曲-数据结构 Map / List
个人能力有限,暂时不整理温习 红黑二叉树 该篇文章主要讲述 HashMap 、ConcurrentHashMap 部分区别(从扩容消耗内存方面 介绍下ArrayMap),在文章末尾会简单的提到 List 部分的面试知识点。 update time 2019年12月09日13:33:531. HashMap这里的HashMap 主要针对 JDK 1.8 版本,JDK1.7 没有引入红黑树概念HashMap 实际上是一个“链表散列”的数据结构,即数组和链表的结合体。它是基于哈希表的 Map 接口.
2021-08-20 20:22:45 187
原创 炫酷到爆表的 Navigation 动画
在上一篇中我们说到了使用Navigation导航Fragment,介绍了Navigation的基本使用,然后突然想到做一些Fragment的跳转动画,所以产生了一些内容哈哈哈Navigation中使用动画通常我们设置一个跳转action是酱紫的:<action android:id="@+id/action_scale1" app:destination="@id/fragmentTwo" app:enterAnim="@anim/scale_in_right.
2021-08-20 16:16:12 533
原创 Android 组件化代码中心化问题之.api化方案
一、代码中心化问题将一个大型的项目拆分成多个Module或者新开的组件化项目,想要的预期是这些module之间是平级的关系.这样一来就可以使得业务相对集中,每个人都可以专注在一件事上。同时,代码的耦合度也会随之降低,达到高度解耦状态,因为同级的module不存在依赖关系,在编译上就是隔离的,这会让组件间的依赖非常清楚,同时也具有更高的重用性,组件强调复用,模块强调职责划分。 他们没有非常严格的划分。达到可复用要求的模块,那么这个模块就是组件。每个组件的可替代性、热插拔、独立编译都将可行,
2021-08-19 15:49:52 376 3
原创 探讨一下:单Activity+多Fragment模式
自从知道这一招之后我基本不太愿意使用activity了,fragment可以快速创建和管理,可以合理设计页面跳转,设计炫酷的跳转动画,一些操作可以统一进行管理。用Fragment替代Activity以前大部分时候都是将Activity作为页面,Fragment作为页面中的子页面(当时称之为碎片),基本上大部分功能由activity实现,比如老版本的淘宝app就是有上百个activity,当时卡顿的不要不要的。随着技术迭代,我们发现activtiy创建、切换、销毁所消耗的性能远比fragment要大.
2021-08-18 15:49:22 4629 1
原创 Jetpack LiveData 如何安全的观察数据
LiveData 是什么?LiveData是JetPack组件之一,LiveData是一个可观察的数据持有类,可以感知生命周期。 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。(来自Android官方解释)LiveData的介绍和使用不在累述,直接看官方文档,本篇文章旨在讲解Liv.
2021-08-17 21:04:17 186 1
原创 Android 架构 MVC MVP MVVM,这一波你应该了然于心
MVC,MVP和MVVM是软件比较常用的三种软件架构,这三种架构的目的都是分离,避免将过多的逻辑全部堆积在一个类中。在Android中,Activity中既有UI的相关处理逻辑,又有数据获取逻辑,从而导致Activity逻辑复杂不单一难以维护。为了一个应用可以更好的维护和扩展,我们需要很好的区分相关层级,要不然以后将数据获取方式从数据库变为网络获取时,我们需要去修改整个Activity。架构使得View和数据相互独立,我们把应用分成三个不同层级,这样我们就能够单独测试相关层级,使用架构能够把大多数逻
2021-08-17 16:31:14 476 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人