暂时未有相关云产品技术能力~
专注于Android开发领域,8年开发经验,CSDN博客专家认证。曾就职于58、滴滴等公司,目前就职于作业帮,负责移动端业务开发。
Android Path测量工具:PathMeasure
本篇来看看自定义ViewGroup
**本文仅用于学习利用LruCache、DiskLruCache图片缓存策略、实现瀑布流和Matix查看大图缩放移动等功能,如果想用到项目中,建议用更成熟的框架,如[glide]
不同于LruCache,LruCache是将数据缓存到内存中去,而DiskLruCache是外部缓存,例如可以将网络下载的图片永久的缓存到手机外部存储中去,并可以将缓存数据取出来使用,DiskLruCache不是google官方所写,但是得到了官方推荐
WebView 用来显示网页的一个View,它使用WebKit渲染引擎显示web页面,可以加载在线的或者本地的html页面,WebView可以对页面进行一系列操作,如历史页面的向前、向后,放大和缩小,执行文本搜索,与JS交互等等
Android Canvas之Path操作
Android仿QQ侧滑菜单
Gradle是一个先进的构建系统,也是一个允许通过插件创建自定义构建逻辑先进的构建工具。
因为Android UI线程是线程不安全的,在子线程中更新UI会直接程序崩溃,另外当UI线程需要执行一个比较耗时的操作的话(IO操作,网络通信等),若是执行时间超过5s,程序会直接ANR,为了解决上述问题,可以使用异步消息处理机制[Handler]
Android高仿QQ小红点
自定义View&自定义ViewGroup
SharedPreferences源码解析
本文主要是通过模仿魅族通讯录,学习一下RecycleView的基本用法
开启多进程及进程间通信的几种方式
SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持 Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、PHP、Java、C++、.Net等,还有ODBC接口,同样比起 Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。
用Webview加载一个网页时,如果加载时间长,界面会一直空白,体验不太好,所以加个进度条更好看一下
本篇接着来看Canvas
Android提供了多种选择来保存永久性的数据,根据不同的需求来使用不同的保存方式
6.0运行时申请权限已经是一个老生常谈的内容了,最近项目TargetSDKVersion升到23以上,所以我们也需要做权限管理
两种方式可以引入`WindowInsetsController`,一种直接通过`API`的`val controller = window.decorView.windowInsetsController`获取,注意该方法在`API30`及以上才有
深入理解View.post()获取宽高、Window加载View原理
`Android`常用的四种补间动画分别为`RotateAnimation`、`ScaleAnimation`、`TranslateAnimation`、`AlphaAnimation`,他们的父类为`Animation`
本文基于 `ViewPager2` 实现的 `Banner` 效果,进而实现了仿淘宝、京东`Banner`滑动至最后一页时继续滑动来查看图文详情的效果。
`PopupWindow`这个类用来实现一个弹出框,可以使用任意布局的`View`作为其内容,这个弹出框是悬浮在当前`Activity`之上的,一般`PopupWindow`的使用
`SharedPreferences(以下简称SP)`是Android本地存储的一种方式,是以`key-value`的形式存储在`/data/data/项目包名/shared_prefs/sp_name.xml`里
Fragment.setUserVisibleHint()懒加载过时问题优化
`ASM`是一个通用的`Java字节码操作和分析框架`。它可用于`修改现有类`或`直接以二进制形式动态生成类`。`ASM`提供了一些常见的字节码转换和分析算法,可以根据这些算法构建定制的复杂转换和代码分析工具。
`Java` 能做到 `一次编译,到处运行`,主要就是靠 `class字节码` 文件,也就是 `java` 文件经过编译之后 `.java -> .class`,然后再被` JVM` 虚拟机加载。其实,不仅是 `java` 语言,只要是符合规则的 `class` 字节码文件,都可以被 `JVM` 加载
- 进程是资源分配的最小单位,线程是`cpu`调度的最小单位。 - 进程可以看做独立应用,而线程不能。一个程序会产生一个进程,而一个进程包含一个或多个线程。 - 进程间是相互隔离的,线程可以共享进程内的资源
在开始介绍线程池之前,先来介绍下`Callable`和`Future`的概念,众所周知,`Android`中实现多线程的方式有两种,实现`Runnable`接口或者继承一个`Thread`,但是这两种方式都有一个缺点:在任务执行完成之后没有返回结果,所以在`Java 1.5`之后,出现了`Callable`和`Future`,通过他们构建的线程,可以在线程执行完成之后得到返回结果。
线程池阻塞队列BlockingQueue及其相关实现ArrayBlockingQueue、LinkedBlockingQueue
在之前介绍`MVVM`的文章中,介绍了常用的`MVC、MVP、MVVM`架构及其对`MVVM`的封装使用,其中`MVVM`的主旨可以理解为数据驱动:`Repository`提供数据,`ViewModel`中发送数据,`UI层`使用的`LiveData`订阅数据,当有数据变化时会主动通知`UI层`进行刷新。
`MVC`、`MVP`、`MVVM`架构及其对`MVVM`的封装使用,其中`MVVM`的主旨可以理解为数据驱动:`Repository`提供数据,`ViewModel`中发送数据,`UI层`使用的`LiveData`订阅数据,当有数据变化时会主动通知`UI层`进行刷新。接下来继续讨论`LiveData`的局限性以及`google`推荐的`UI`层订阅数据方式
`Jetpack DataStore` 是一种改进的新数据存储解决方案,允许使用**协议缓冲区**存储键值对或类型化对象。`DataStore` **以异步、一致的事务方式存储数据,克服了 SharedPreferences(以下统称为SP)的一些缺点**。`DataStore`基于`Kotlin`协程和`Flow`实现,并且可以对`SP`数据进行迁移,旨在取代`SP`
ViewModel的定义:**ViewModel旨在以注重生命周期的方式存储和管理界面相关的数据**。ViewModel本质上是视图(View)与数据(Model)之间的桥梁,想想以前的MVC模式,视图和数据都会写在Activity/Fragment中,导致Activity/Fragment过重,后续难以维护,而ViewModel将视图和数据进行了分离解耦,为视图层提供数据。
MVVM使用及封装详解
在Android开发中,跨页面传递数据(尤其是跨多个页面传递数据)是一个很常见的操作,可以通过Handler、接口回调等方式进行传递,但这几种方式都不太优雅,**消息总线**传递数据的方式相比更优雅。
**LiveData是一种可观察的数据存储类**。LiveData 具有生命周期感知能力,遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的Observer,非活跃状态下的Observer不会受到通知。
`Lifecycle`可以让某一个类变成`Activity`、`Fragment`的生命周期观察者类,监听其生命周期的变化并可以做出响应。`Lifecycle`使得代码更有条理性、精简、易于维护。
在 `Kotlin` 中,`reduce()` 和 `fold()` 是函数式编程中常用的高阶函数。它们都是对集合中的元素进行聚合操作的函数,将一个集合中的元素缩减成一个单独的值。它们的使用方式非常相似,但是返回值略有不同
Flow数据流的几种使用场景及其注意事项
泛型,指的是具体的类型泛化,多用在集合中(如`List`、`Map`),编码时使用符号代替,在使用时再确定具体类型。
kotlin中vararg的使用规则
Kotlin data数据类、copy()函数、sealed密封类使用
`Kotlin`代码可以经过编译器转换成`VM虚拟机`能识别的字节码,所以`Java`与`Kotlin`可以互相进行调用。而由于`Java`与`Kotlin`语言特性的差异,当`Java`调用`Kotlin`代码时,可以在`Kotlin`代码中适当增加一些注解,从而更方便的调用`Kotlin`代码。
如果`Handler`在`Activity`中是以非静态内部类的方式初始化的,那么`Handler`默认就会持有`Activity`的实例,因为在`Java`中:**非静态内部类默认会持有外部类的实例,而静态内部类不会持有外部类的实例**
`Flow`数据流可以按顺序发送多个值,一个倒计时功能刚好符合这种场景,本文就尝试使用`Flow`来实现一个倒计时功能
`Flow`是`google`官方提供的一套基于`kotlin`协程的响应式编程模型,它与`RxJava`的使用类似,但相比之下`Flow`使用起来更简单,另外`Flow`作用在协程内,可以与协程的生命周期绑定,当协程取消时,`Flow`也会被取消,避免了内存泄漏风险。
`Kotlin` 标准库包含几个函数,目的是在对象的上下文中执行代码块。**当对一个对象调用这样的函数并提供一个 `lambda` 表达式时,会形成一个临时作用域。在此作用域中,可以访问该对象而无需其名称。这些函数称为作用域函数**。共有以下五种:`let、run、with、apply 以及 also`。
如果一个函数接收另一个函数作为参数,或返回类型是一个函数类型,那么该函数被称为是高阶函数