自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小马快跑的博客

如果文章对您有帮助,欢迎关注、点赞。 感谢!

  • 博客(187)
  • 资源 (2)
  • 收藏
  • 关注

原创 高效复用:RecyclerView内部嵌套横向列表时的优化技巧

直接创建多个固定的子View,但这种方式不够灵活,且在动态创建子View时则无能为力了;通过ViewGroup方式动态的创建各个子View,这种方式本身不能缓存子View,所以每次上下滑动时都会重新创建子View,虽然能实现我们想要的效果,但是性能并不是最优的;通过RecyclerView创建内部的列表,且通过DiffUtil进行数据对比,数据变化时更新,否则什么都不做。这种方式会在第一次创建各个子View,后面每次上下滑动时由于数据没有变化,所以会什么都不做,但是数据展示依然是正确的。

2023-07-26 00:46:51 237

原创 2022-2023年文章分类整理

2022&2023发表的文章,分类整理一下,方便阅读!2023,继续加油,共勉!

2023-02-11 19:12:51 642

原创 Android 深入理解View.post()获取宽高、Window加载View原理

继承自接口,提供了添加、删除、更新View的API,可以看作是WMS在客户端的代理类。实现了ViewParent接口,其是整个View树的根部,View的测量、布局、绘制以及输入事件的处理都由触发;另外,它还是的实际工作者,负责与WMS交互通信以及处理WMS传过来的事件(窗口尺寸改变等)。的生命从setView()开始,到die()结束,ViewRootImpl起到了承上启下的作用。

2022-11-21 01:58:16 1738

原创 Android Jetpack系列之MVI架构

在之前介绍MVVM的文章中,介绍了常用的架构及其对MVVM的封装使用,其中MVVMRepository提供数据,ViewModel中发送数据,UI层使用的LiveData订阅数据,当有数据变化时会主动通知UI层进行刷新。有兴趣的可以去看一下:1、Android Jetpack系列之MVVM使用及封装2、Android Jetpack系列之MVVM使用及封装(续)那么MVI又是什么呢?看了一些关于MVI的文章,大家都称MVI是(Model-View-Intent),其中Intent称为意图(注意这里的。

2022-10-03 22:06:29 3042 1

原创 Android仿淘宝、京东Banner滑动查看图文详情

本文基于ViewPager2实现的Banner效果,进而实现了仿淘宝、京东Banner滑动至最后一页时继续滑动来查看图文详情的效果。

2022-10-01 13:07:43 2029

原创 Kotlin | 深入理解协程

可以在不引入回调的情况下控制任何代码行的线程池,因此可以将其应用于非常小的函数,例如从数据库中读取数据或执行网络请求。来确保每个函数都是主线程安全的,这意味着,您可以从主线程调用每个函数。注:上面的协程启动方式并不推荐在项目中直接使用,因为生命周期比较长,如果没有主动关闭可能就会产生内存泄漏。,但是最终子协程中的异常还是在顶层的父协程种处理的,如果就想在子协程中处理异常呢?可见异常最终是在子协程中处理的,且虽然子协程中发生了异常,父协程依然能执行完毕。之后的延续,其中类型T代表的是原来函数的返回值类型。

2022-09-19 21:43:57 2400

原创 Android 性能优化篇之SharedPreferences使用优化

是Android本地存储的一种方式,是以XML的形式存储在文件里。

2022-06-20 18:10:27 1104 1

原创 Android Jetpack系列之MVVM使用及封装(续)

文章目录写在前面LiveData的缺点存在的问题尝试解决新问题产生了进一步优化写在前面在前一篇 Android Jetpack系列之MVVM使用及封装 文章中,介绍了常用的MVC、MVP、MVVM架构及其对MVVM的封装使用,其中MVVM的主旨可以理解为数据驱动,UI层使用的LiveData订阅数据,Repository提供数据,ViewModel中发送数据。接下来继续讨论LiveData的局限性以及google推荐的UI层订阅数据方式。LiveData的缺点在学习LiveData时,我们知道通过L

2022-05-08 23:38:27 1540

原创 Android 深入理解ViewPager2原理及其实践(下篇)

文章目录一 效果图1.1 源码地址1.2 API介绍二 核心实现思路2.1 无限轮播2.2 轮播动画过渡2.3 处理嵌套滑动冲突2.4 配合DiffUtil增量更新2.5 自定义Item样式本篇文章主要介绍基于ViewPager2(以下简称VP2)实现的一个Banner轮播库。一 效果图功能示例基本使用仿淘宝搜索栏上下轮播1.1 源码地址上述示例效果源码参见:lib_viewpager21.2 API介绍二 核心实现思路2.1 无限轮播为了实现无限轮播,首

2022-02-01 00:41:11 3790

原创 Android 深入理解ViewPager2原理及其实践(上篇)

ViewPager2介绍

2022-01-29 16:51:02 8842

原创 Android Jetpack系列之DataStore

文章目录DataStore介绍DataStore使用Preferences DataStoreProto DataStoreSharedPreferences缺点SharedPreferences迁移至DataStore总结参考DataStore介绍Jetpack DataStore 是一种数据存储解决方案,允许使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。DataStore 以异步、一致的事务方式存储数据,克服了 Sh

2021-11-17 15:54:28 2808

原创 Android Kotlin之Flow数据流

文章目录Flow介绍Flow使用举例运算符创建操作符中间操作符尾端操作符功能操作符StateFlowStateFlow vs LiveDataSharedFlow完整代码地址参考Flow介绍Flow是google官方提供的一套基于kotlin协程的响应式编程模型,它与RxJava的使用类似,但相比之下Flow使用起来更简单,另外Flow作用在协程内,可以与协程的生命周期绑定,当协程取消时,Flow也会被取消,避免了内存泄漏风险。我们知道 协程是轻量级的线程,本质上协程、线程都是服务于并发场景下,其中协

2021-10-11 20:31:01 13724 2

原创 Android Jetpack系列之MVVM使用及封装

文章目录Android开发架构MVCMVPMVVMUI驱动 vs 数据驱动MVVM的具体实现方案Jetpack MVVMMVVM封装总结参考Android开发架构如果开发过程中大家各自为战,没有统一规范,久而久之,项目代码会变得混乱且后续难以维护。当使用开发架构模式后,有很多的好处,如:统一开发规范,使得代码整洁、规范,后续易于维护及扩展提高开发效率(尤其在团队人员较多时)模块单一职责,使得模块专注自己内部(面向对象),模块间解耦总之,开发架构是前人总结出来的一套行之有效的开发模式,目的是达

2021-09-14 14:51:45 2879 2

原创 Android 基于Jetpack LiveData实现消息总线

文章目录消息总线EventBusRxBusLiveDataBus原理LiveData实现消息总线的优势LiveData实现消息总线存在的隐患LiveData默认是粘性消息LiveData.postValue可能会丢失消息解决方案支持粘性、非粘性消息支持子线程发送消息参考前面的文章 Android Jetpack系列之LiveData 介绍了LiveData的基本用法,本文来介绍一下LiveData的一个进阶用法 - 基于LiveData实现消息总线消息总线在Android开发中,跨页面传递数据(尤其是

2021-09-08 02:16:35 1244

原创 Kotlin内联函数inline、noinline、crossinline

文章目录高阶函数内联函数inlinenoinlinecrossinline总结参考高阶函数首先来看下kotlin里的高阶函数定义:如果一个函数接收另一个函数作为参数,或返回类型是一个函数类型,那么该函数被称为是高阶函数。比如下面的代码:private fun highFuc(name: String, block: (String) -> Unit) { block(name)}其中highFuc是函数名,函数中传入了2个参数,第一个参数为String类型,第二个参数即是函数类型

2021-08-26 01:46:02 2072 2

原创 Android Jetpack系列之ViewModel

文章目录ViewModel介绍ViewModel用法ViewModel与onSaveInstance(Bundle)对比源码解析ViewModel的存取ViewModelStore的存取参考ViewModel介绍ViewModel的定义:ViewModel旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel本质上是视图(View)与数据(Model)之间的桥梁,想想以前的MVC模式,视图和数据都会写在Activity/Fragment中,导致Activity/Fragment过重,后续难

2021-07-21 11:24:13 1778

原创 Android Jetpack系列之LiveData

文章目录LiveData介绍LiveData优点LiveData使用举例基础用法进阶用法Transformations.map()修改数据源Transformations.switchMap()切换数据源源码解析发送数据setValue/postValue注册观察者Observer并监听数据变化LiveData.observe()LiveData.observeForever()LiveData实现类MutableLiveData数据切换/修改 Transformations.map()/switchMap

2021-07-18 00:54:07 1760 3

原创 Android Jetpack系列之Lifecycle

文章目录Lifecycle介绍场景caseLifecycle使用Activity/Fragment中使用Lifecycle自定义LifecycleOwnerApplication中使用LifecycleService中使用Lifecycle源码解析Lifecycle.javaEvent生命周期事件分发&接收参考Lifecycle介绍Lifecycle可以让某一个类变成Activity、Fragment的生命周期观察者类,监听其生命周期的变化并可以做出响应。Lifecycle使得代码更有条理性、精

2021-07-04 23:03:50 2844 8

原创 JUC系列学习(一):线程池Executor框架及其实现ThreadPoolExecutor

文章目录Executor框架ThreadPoolExecutor执行流程线程池状态AsyncTaskAsyncTask中任务的串行&并行参考Executor框架Executor框架将任务的提交与任务的执行解耦了。Executor 顶层接口,Executor中只有一个execute方法,用于执行任务。线程的创建、调度等细节均由其子类实现ExecutorService 继承并扩展了Executor,在ExecutorService内部提供了更全面的提交机制以及线程池关闭等方法。Thread

2020-12-27 23:29:02 446

原创 Java多线程之ThreadLocal的使用及源码解析

文章目录ThreadLocal是什么使用例子源码解析初始化set值get值ThreadLocal在Handler中的使用参考ThreadLocal是什么ThreadLocal是一个能创建线程局部变量的类。通过ThreadLocal提供的get和set方法,可以为每一个使用该变量的线程保存一份数据副本,且线程之间是不能相互访问的,从而达到变量在线程间隔离、封闭的效果。使用例子public s...

2020-04-27 16:23:53 444

原创 Android深入理解RecyclerView的缓存机制

文章目录写在前面四级缓存ViewCacheExtensionRecyclerView & ListView缓存机制对比参考RecyclerView在项目中的使用已经很普遍了,可以说是项目中最高频使用的一个控件了。除了布局灵活性、丰富的动画,RecyclerView还有优秀的缓存机制,本文尝试通过源码深入了解一下RecyclerView中的缓存机制。写在前面RecyclerView是通...

2020-03-23 21:48:22 7168

原创 Android | 序列化Serializable/Parcelable 使用总结

文章目录什么是序列化?为什么要序列化?怎么进行序列化?Serializable实现原理serialVersionUID举例Parcelable实现原理举例Parcelable、Serializable比较效率对比容错率对比总结参考什么是序列化?为什么要序列化?怎么进行序列化?序列化定义:将一个类或对象转换成可存储、可传输状态的过程。对象序列化后,可以在进程内/进程间、网络间进行传输,也可以做本...

2020-02-03 21:08:14 9235

原创 Gradle理论与实践四:自定义Gradle插件

文章目录Gradle插件1、Java Gradle插件2、Android Gradle插件2.1、应用Android Gradle插件Gradle插件Gradle可以认为是一个框架,负责定义流程和规则。而具体的编译工作则是通过插件的方式来完成的。比如编译 Java 有 Java 插件,编译 Groovy 有 Groovy 插件,编译 Android APP 有 Android APP 插件,编...

2018-12-25 15:10:56 8466 3

原创 Gradle配置中subprojects 和 allprojects 的区别

subprojects 和 allprojects 的区别,先给出结论,然后通过一个例子来佐证结论。结论:allprojects是对所有project的配置,包括Root Project。而subprojects是对所有Child Project的配置举个例子:新建一个test_gradle的文件夹,在文件夹里新建build.gradle和settings.gradle文件,另外再新建两个...

2018-12-24 12:30:02 29416 1

原创 Gradle理论与实践三:Gradle构建脚本基础

文章目录Gradle构建脚本基础1、创建一个task2、创建Task的几种方式3、Task内部执行顺序4、Task任务依赖5、自定义属性Gradle构建脚本基础Project:根据业务抽取出来的一个个独立的模块Task:一个操作,一个原子性操作。比如上传一个jar到maven中心库等Setting.gradle文件:初始化及整个工程的配置入口build.gradle文件:...

2018-12-24 12:25:30 2530 1

原创 Gradle理论与实践二:Groovy介绍

Groovy介绍Groovy是基于JVM虚拟机的一种动态语言,语法和Java非常相似,Groovy代码在执行时同样编译成Class字节码在JVM上执行,可以认为Groovy扩展了Java语言。除此之外,Groovy还支持闭包、支持DSL(Domain Specific Lauguage 领域特定语言),是一门非常灵活的脚本语言。Groovy、Java、JVM之间的关系:Groovy的一些特...

2018-12-24 12:16:43 2155 1

原创 Gradle理论与实践一:Gradle入门

文章目录Gradle入门1、配置Gradle环境2、Gradle之Hello World3、gradle 与gradlew的区别4、Gradle命令介绍5、Gradle 工作流程Gradle入门Gradle一门DSL(Domain Specific Language,领域特定语言),Gradle基于Groovy语言,专门用来解决自动化构建。Gradle可以认为是一个框架,负责定义流程和规则。而...

2018-12-24 12:03:45 3877 1

原创 GIT常用命令总结(持续更新中...)

GIT常用命令总结删除远程分支git push --delete origin 分支名修改提交人的姓名和邮箱全局替换:git config --global user.name 用户名git config --global user.email 用户邮箱查看当前分支状态git status从当前分支上创建新分支1、更新当前分支的代码 git pull origi...

2018-09-29 00:47:32 2184 1

原创 Android基于DialogFragment封装一个通用的Dialog

文章目录一、背景二、效果图三、为什么选择DialogFragment?四、UML图五、使用文档六、源码地址一、背景Dialog是项目中最常用的一个功能之一了,接手项目的时候发现项目中是封装了一个dialog的,但是发现是用单例封装的,大致如下: private MyDialog() { } public static MyDialog getInstance() {...

2018-09-19 20:01:14 11268 7

原创 Android嵌套滑动的分析与实践

【一】传统事件分发1.1 传统事件分发流程1.2 传统事件滑动冲突1.2.1外部拦截法1.2.2内部拦截法1.3 传统嵌套滑动冲突1.3.1 ScrollView+ ListView嵌套冲突1.3.2 ScrollView+ ViewPager嵌套问题【二】 传统事件分发 VS NestedScrolling【三】NestedScrolling嵌套滑动2.1 ...

2018-06-27 20:50:36 1067

原创 Android 采用AOP方式封装6.0权限管理

本篇文章已授权微信公众号 hongyangAndroid(鸿洋)独家发布目录:【一】背景【二】效果图【三】整体思路【四】使用举例4.1 申请单个权限4.2 申请多个权限4.3 跳转到设置类【五】总结【六】源码【一】背景6.0运行时申请权限已经是一个老生常谈的内容了,最近项目TargetSDKVersion升到23以上,所以我们也需要做权限管理,我...

2018-03-30 15:46:19 4405 11

原创 Java | 自定义注解及解析

先来看内置注解@Override是怎么被定义的,它位于@Target定义声明注解的作用域(作用在类上还是方法上),@Retention定义注解在哪个级别可用,在源代码中(SOURCE)、类文件中(CLASS)、还是运行时(RUNTIME除了还有及@Inherited元注解作用@Target表示注解作用在什么地方,声明在构造器、FIELD域声明、METHOD方法声明、PACKAGE包声明、TYPE类、接口或者enum声明、PARAMETER参数声明、局部变量声明@Retention。

2018-03-28 16:36:52 8948 3

原创 Android本地存储的几种方式

Android提供了多种选择来保存永久性的数据,根据不同的需求来使用不同的保存方式,一般情况下,保存数据的方式有下面几种:SharedPreferences内部存储外部存储SQLite网络连接下面主要来看一下前四种数据保存方式。SharedPreferencesSharedPreferences(以下简称SP)以键值对形式进行存储,数据以xml形式存储在/data/......

2018-01-15 19:30:50 41573

原创 Android使用LruCache、DiskLruCache实现图片缓存+图片瀑布流

PS:本文中的例子来源于官网地址:Caching Bitmaps,源码地址(自备梯子):Caching Bitmaps Demo,并在其基础上稍微改变了一下。PPS:本文仅用于学习利用LruCache、DiskLruCache图片缓存策略、实现瀑布流和Matix查看大图缩放移动等功能,如果想用到项目中,建议用更成熟的框架,如glide、picasso 等。在开始本文之前,请先了解下LruCache和

2017-07-17 17:52:35 819

原创 Android高仿QQ小红点

上一篇文章分析了QQ侧滑栏的实现, 文章地址: http://www.jianshu.com/p/1834ce7a2ce7 ,本篇继续来实现一下QQ小红点的功能,闲言少叙,先上效果图:代码已上传至Github:高仿QQ小红点,如对您有帮助,欢迎star~感谢绘制贝塞尔曲线:主要是当在一定范围内拖拽时算出固定圆和拖拽圆的外切直线以及对应的切点,就可以通过path.quadTo()来绘制二阶贝塞尔曲线

2017-06-20 00:21:20 1944

原创 Android高仿QQ侧滑菜单

先上效果图: GIF图有点模糊,源码已上传Github:Android仿QQ侧滑菜单整体思路:自定义ItemView的根布局(SwipeMenuLayout extends LinearLayout),复写onTouchEvent来处理滑动事件,注意这里的滑动是View里面内容的滑动而不是View的滑动,View里内容的滑动主要是通过scrollTo、scrollBy来实现,然后自定义SwipeR

2017-06-13 10:12:52 3186 1

原创 Android使用RecycleView实现魅族手机通讯录界面

本文主要是通过模仿魅族通讯录,学习一下RecycleView的基本用法,水平有限,如有不当之处,欢迎批评指正,不胜感激!先看通过RecycleView实现的一个效果图: 完整代码见github:仿魅族通讯录Recycleview继承关系: RecycleView的三个主要参与者: 1、LayoutManager 2、ItemAnimator 3、ItemDecoration 本文主要

2017-05-31 10:54:29 4750 1

原创 Android 封装一个通用的PopupWindow

先上效果图: 完整代码地址已上传Github:CommonPopupWindowPopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的。一般PopupWindow的使用://准备PopupWindow的布局ViewView popupView = LayoutInflater.from(this).inflate(R.l

2017-05-06 18:07:40 8225 9

原创 Android ViewTreeObserver使用总结及获得View高度的几种方法

ViewTreeObserver 注册一个观察者来监听视图树,当视图树的布局、视图树的焦点、视图树将要绘制、视图树滚动等发生改变时,ViewTreeObserver都会收到通知,ViewTreeObserver不能被实例化,可以调用View.getViewTreeObserver()来获得。ViewTreeObserver继承关系:public final class ViewTreeObserve

2017-04-19 10:12:49 2684 1

原创 Android Webview的一些使用总结和遇到过得坑

WebView 用来显示网页的一个View,它使用WebKit渲染引擎显示web页面,可以加载在线的或者本地的html页面,WebView可以对页面进行一系列操作,如历史页面的向前、向后,放大和缩小,执行文本搜索,与JS交互等等;在使用Webview时,请记得在AndroidManifest.xml文件中声明INTERNET权限:<uses-permission android:name="andr

2017-04-06 13:35:49 14658 1

Android数据库Sqlite的基本用法及升级策略

http://www.jianshu.com/p/3fef519f3d8e Android数据库Sqlite的基本用法及升级策略

2017-10-29

DiskCacheDemo

利用DiskLruCache缓存数据,并从缓存目录中取出数据

2017-06-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除