自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

墨玉浮白的博客

用于学习记录、技术提升

  • 博客(218)
  • 收藏
  • 关注

原创 LiveData原理分析

文章目录简述LiveData原理1.订阅、绑定2.setValue发送消息3.总结简述LiveData是一个可被观察的数据容器类,它将数据包装起来,使数据成为被观察者。当数据发生改变时,观察者能够及时得到通知。又是一个典型的观察者模式!ViewModel用来存放页面所需要的数据、和数据相关的处理逻辑(在ViewModel中对数据进行加工、获取),站在页面的角度上,它并不关心ViewModel的业务逻辑,只关心需要展示的数据是啥。它希望在数据发生改变时,能够及时的得到通知并作出更新。而LiveData的

2020-10-14 14:50:40 21

原创 LifeCycle原理分析

文章目录简述LifeCycle的原理简述解耦是永恒不变的话题,但是又不得不做。平时在onCreate方法中初始化,在onDestory中回收资源,这样会使页面和组件之间的耦合度增加,不这样做又会造成内存泄漏。我们希望对组件的管理,不仅仅是依赖生命周期函数的管理方法。LifeCycle正是因此出现的,组件就能够在内部自己管理自己的生命周期,从而降低模块间的耦合度,并降低内存泄漏的可能性。LifeCycle的原理LifeCycle是通过观察者模式,实现对页面生命周期的监听。Jetpack提供了两个类:

2020-10-14 10:49:40 58

原创 解析RecyclerView的缓存机制

文章目录复用:layoutChunk(recycler, state, layoutState, layoutChunkResult)1. getChangedScrapViewForPosition方法--->mChangedScrap2.getScrapOrHiddenOrCachedHolderForPosition--->mAttachedScrap、mCachedViews3. getScrapOrCachedViewForId--->mAttachedScrap、mCached

2020-07-16 15:50:39 125

原创 事件分发机制并不是洪水猛兽

当MotionEvent产生后,系统总归要将其传递到某个View,这个过程就是事件分发。事件分发机制离不开3个重要方法:dispatchTouchEvent(分发)、onInterceptTouchEvent(拦截,在dispatchTouchEvent中调用。需要注意,View中没有该方法)、onInterceptTouchEvent(处理事件,在dispatchTouchEvent中调用。)这3个方法相爱相杀,紧密关联。ViewGroup收到点击事件后,它的dispatchTouchEvent方法首先

2020-07-13 18:23:21 85

原创 对ViewPager的理解

文章目录设置wrap_content无效?

2020-07-08 18:10:58 86

原创 解析SharedPreferences

文章目录简介一、文件保存二、SP创建三、SP数据加载四、getxxx()操作五、putXXX()操作5.1 commit &&apply5.2 apply简介sp作为轻量级存储,数据最终都是以xml的形式进行存储的。一、文件保存SharedPreferences config = getSharedPreferences("config", Context.MODE_PRI...

2020-04-30 13:13:06 144

原创 9.0适配刘海屏

刘海屏适配,就是不让刘海遮挡住应用程序,不影响应用程序的正常使用。竖屏情况下,系统会根据刘海的高度,响应调整状态栏的高度。因此,刘海对竖屏模式没有影响。可是横屏模式下,刘海区域就会变成一条大黑边。Android 9.0系统中提供了3种layoutInDisplayCutoutMode属性来允许应用自主决定该如何对刘海屏设备进行适配:①LAYOUT_IN_DISPLAY_CUTOUT_M...

2020-04-27 15:49:17 78

原创 沉浸式学习

沉浸式就是利用系统状态栏,将背景图片延伸至系统状态栏区域内,效果就是和游戏应用画面那样。Action1 隐藏状态栏和ActionBar仅仅是隐藏状态栏和ActionBar,只是粗暴的隐藏了而已//获取当前界面的DecorView View decorView = getWindow().getDecorView(); //表示全屏,即隐藏状态栏 int option ...

2020-04-27 10:36:56 816

原创 黑白屏解决方案

文章目录一、黑白屏原因二、解决方案2.1 修改AppTheme2.2 自定义AppTheme一、黑白屏原因在app启动流程中,当系统加载并启动app时,需要耗费一定的时间。即使这个时间非常短,但是用户依旧会感觉点击App图标的“延迟”。为解决这一问题,Google在App创建的过程中,先展示一个空白页面,让用户体会到点击图标后立马就会有响应。而这个空白页面的颜色,就是根据我们清单文件中配置的主...

2020-03-27 21:59:09 115

原创 刘海屏适配

文章目录一、简述二、实现三、手机厂商的适配四、工具类一、简述Android官方9.0刘海屏的适配策略是:如果非全屏模式(有状态栏),则app不受刘海屏的影响,刘海屏的高就是状态栏的高;如果全屏模式,app未适配刘海屏,系统会对界面做特殊处理,竖屏向下移动,横屏向右移动。二、实现必须在setContentView方法前调用 requestWindowFeature(Window.FEATU...

2020-03-18 15:40:26 109

原创 修改系统density适配

文章目录一、简述二、追根溯源三、实现3.1 定义Density用于对系统类值的修改3.2 在MainActivity中调用3.3 处理应用程序关于字体大小的监听3.4 如果多界面统一处理怎么办?3.4.1 BaseActivity3.4.2 监听应用程序的变化四、完整代码一、简述修改density(屏幕密度,若每英寸有160像素点,该值就为1)、scaleDensity(字体缩放比例),den...

2020-03-17 21:57:40 172

原创 百分比布局适配

文章目录一、简述二、google推荐的百分比布局的使用方式三、实现3.1 创建属性文件3.2 解析3.3 计算并设置百分比布局四、使用五、完整代码六、注意一、简述百分比布局适配,就是以父容器的尺寸作为基准,在view的加载过程中,根据当前父容器实际尺寸换算出目标尺寸,再作用在view上。百分比布局,实际是对容器的一种扩展,即对宽高百分比的设置。二、google推荐的百分比布局的使用方式首...

2020-03-17 14:28:55 850

原创 自定义像素适配

文章目录一、简述二、实现2.1 通过单例获取当前设备的宽高2.2 获取屏幕的宽高2.3 获取状态栏高度2.4 计算缩放比例三、使用四、完整代码五、注意一、简述自定义像素适配,就是以一个特定宽度尺寸的设备为基准,在view的加载过程中,根据当前设备的实际像素换算出目标像素,再作用于控件上。二、实现2.1 通过单例获取当前设备的宽高 // 获取单例方法 public static U...

2020-03-17 14:07:57 83

原创 EventBus源码分析

文章目录一、基本用法1.1 黏性事件二、源码分析2.1 订阅者注册2.1.1 EventBus.getDefault()2.1.2 .register(this)2.2了解EventBus基本用法之前,要先了解一下它的三要素:Event:事件。可以是任意类型的对象Subscriber:事件订阅者。3.0以后可随意取名,添加@Subscribe注解并指定现场模型即可(默认POSTING)P...

2020-03-14 16:28:24 52

原创 Glide源码分析

文章目录Glide的用法一、with二、load三、into3.1 buildImageViewTarget3.2 return的into方法3.2.1 将Request和View进行绑定,并保存到tag3.2.2 track当前请求Glide的用法Glide.with(this) // 返回RequestManager对象 .load(imageUrl) ...

2020-03-11 14:14:35 2243

原创 Retrofit源码分析

文章目录一、简介二、请求流程三、创建Retrofit实例3.1 new Retrofit3.2 xx.Builder()3.3 .baseUrl("http://www.baidu.com/")3.4 .addConverterFactory(GsonConverterFactory.create())3.5 .build()四、创建网络请求接口的实例4.1 创建接口类实例:API api= re...

2020-03-02 19:14:10 74

原创 OkHttp源码解析

文章目录一、请求流程二、同步、异步网络请求2.1 同步网络请求2.2 异步网络请求三、分发器Dispatcher四、责任链执行过程4.1 重试和重定向RetryAndFollowUpInterceptor4.2 桥拦截器BridgeInterceptor4.3 缓存拦截器CacheInterceptor4.4 连接拦截器ConnectInterceptor4.5 服务器请求拦截器CallServe...

2020-02-04 18:02:41 120

原创 MAC安装MySQL

文章目录一、安装MySql Community Server二、安装Navicat一、安装MySql Community Server首先要安装MySql Community Server,具体的下载、安装可以参考以下链接:1.如何在Macbook上安装MySQL2.mac安装mysql的两种方法(含配置)这里需要注意的是,在安装过程中会提示输入你自己的密码,且会有一个弹窗提示MySQL...

2020-01-23 14:54:26 100

原创 AIDL原理

AIDL原理欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdo...

2020-01-15 10:46:34 83

原创

栈可以理解为一个有底的瓶子,先进后出,后进先出,这是栈的特点。在栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入、删除数据。当然,也不能简单将其定性为“局限性”。因为特定的数据结构是为了对应特定场景,数组、链表暴露了很多操作接口显得比较灵活,但是使用起来可控性上不强,容易出问题。当某个数据集合只涉及在一端插入和删除数据、且满足先进先出、后进后出的特点时,首选栈。实现栈可以使用...

2019-12-19 16:24:45 53

原创 队列

文章目录简介顺序队列和链式队列顺序队列链式队列循环队列阻塞队列和并发队列思考简介队列,就是一个“没有底的瓶子”。先进先出,就是典型的队列特点。栈支持入栈push和出栈pop,队列支持入队enqueue和出队dequeue,从队列头部取元素。和栈一样,队列也是一种操作受限的线性表结构数据。队列的应用广泛,如①底层系统、框架、中间件中的循环队列、阻塞队列、并发队列;②Java concurren...

2019-12-19 13:32:54 75

原创 链表

文章目录前言一、链表1.1 单链表1.2 循环链表1.3 双向链表二、基于链表实现LRU缓存淘汰算法三、挑战链表的技巧3.1 理解指针或引用3.2 注意内存泄漏和指针丢失3.3 利用哨兵简化3.4 边界条件3.5 画图辅助四、常见链表操作前言链表和数组都是非常基础、常用的数据结构,数组需要一块连续的内存空间来存储数据(即使可用总空间足够,不连续也不行),而链表只需要由“指针”将一组零散的内存块...

2019-12-16 20:03:32 50

原创 数组

文章目录一、关键词1.1 线性表1.2 非线性表1.3 连续的内存空间和相同类型的数据二、数组如何根据下标随机访问数组元素?三、插入、删除的低效性3.1 插入3.2 删除四、警惕数组问题4.1 数组越界问题4.2 数组可替代性?五、总结一、关键词数组Array是一种线性表数据结构,用一组连续的内存空间,来存储一组具有相同类型的数据。1.1 线性表数据像一条线一样的排列,线性表上的数据只...

2019-12-12 17:02:11 70

原创 自定义View实现Canvas炫酷效果

整个效果分为旋转、扩散聚合、水波纹效果,首先在定义好一些变量后,要先定义一个抽象类SplashState,提供抽象方法drawState供子类实现。 /** * 这个抽象类,对外提供drawState方法,供子类实现 */ private abstract class SplashState{ abstract void drawState(Canv...

2019-12-11 13:26:27 53

原创 Canvas详解

文章目录一、概念二、常用api类型2.1 绘制集合图形,文本,位图等2.2 位置、形状变换2.2.1 平移操作2.2.2 缩放操作2.2.3 旋转操作2.2.4 倾斜操作2.2.5 切割2.2.6 矩阵2.3 状态保存和恢复三、案例一、概念画布,通过画笔绘制几何图形、文本、路径和位图等。二、常用api类型常用api分为绘制、变换、状态保存和恢复2.1 绘制集合图形,文本,位图等//在指...

2019-12-05 21:29:37 68

原创 Paint滤镜效果实现

文章目录一、LightingColorFilter滤镜(颜色+颜色创建的滤镜效果)二、PorterDuffColorFilter滤镜(颜色+图片)三、ColorMatrixColorFilter滤镜(颜色数组、颜色矩阵)四、常见滤镜效果五、ColorMatrix类5.1 setScale方法5.2 setSaturation方法5.3 setRotate方法一、LightingColorFilt...

2019-12-03 20:12:16 76

原创 Paint画笔

文章目录一、概念二、常用API三、渲染器3.1 LinearGradient线性渲染3.2 环形渲染RadialGradient3.3 扫描渲染SweepGradient3.4 位图渲染BitmapShader3.5 组合渲染ComposeShader一、概念画笔,保存了绘制几何图形、文本和位图的样式和颜色信息二、常用API通过ALT+7查看Paint类结构图,发现有大量的get、set方...

2019-11-26 20:38:30 83

转载 组件化开发和模块化开发概念辨析

网上有许多讲组件化开发、模块化开发的文章,但大家一般都是将这两个概念混为一谈的,并没有加以区分。而且实际上许多人对于组件、模块的区别也不甚明了,甚至于许多博客文章专门解说这几个概念都有些谬误。想分清这两个概念我觉得结合一下软件的渐进式开发场景更容易理解。但是下面的篇幅会比较长,所以我先说结论,不耐烦的同学可以先看:概念区别对比 类别 目的 特点 接口 成果 架构...

2019-11-26 15:49:06 110

原创 View的绘制流程

文章目录一、把DecorView添加到窗口上二、测量--performMeasure方法三、布局--performLayout方法四、绘制--performDraw方法五、总结一、把DecorView添加到窗口上找到绘制入口,先从ActivityThread的handleMessage方法开始。不过得先提一下handleMessage方法所在的类–H,它是Handler的子类,是主线程处理消息...

2019-11-22 21:09:10 60

原创 View是如何被添加到屏幕窗口上的

关于View如何被添加到屏幕窗口上,大体有以下几步:1.创建顶层布局容器DecorView2.在顶层布局中加载基础布局ViewGroup3.将ContentView添加到基础布局中的FrameLayout在平时加载View时,会在onCreate方法中调用setContentView()方法,传入的参数是资源布局id:public void setContentView(@Layou...

2019-11-22 19:36:21 111

原创 Flutter底部导航栏BottomNavigationBar

BottomNavigationBar是底部的导航栏,一般应用在多个视图进行选择。类比于Android的底部导航栏,由Text文本和Icon图标组成。这里创建一个List为显示内容提供容器:static const List<Widget> _widget=<Widget>[ Text('Index 0:首页'),Text("Index 1:通讯录"),Text...

2019-08-16 10:19:51 84

原创 Material组件之MaterialApp、Scaffold、AppBar学习笔记

一、MaterialAppflutter的路由方式有两种:新建路由和注册路由1.1 新建路由Navigator.push负责将新建的路由添加到Navigator管理的route堆栈的栈顶,Navigator.pop用于弹出route堆栈最顶层的Route。其中页面进入动画是向上滑动并淡出,退出动画是向下滑动并淡出。import 'package:flutter/material.dart'...

2019-08-12 19:07:04 448

原创 Flutter Widget

文章目录一、Widget分类二、widget的状态三、根widget四、Basics4.1 模板和主题4.2 Text文本4.3 图片4.4 凸起按钮4.5 其他widget4.5.1 Row4.5.2 container一、Widget分类Widget的分类有很多类别,每个类别下面又包含很多Widget,主要包括以下几种类别:Basics:在构建第一个Flutter应用程序之前,需要知道...

2019-08-12 18:08:00 174

原创 Flutter之Dart入门

文章目录一、准备1.下载Dart插件:2.重启IDEA后,配置Dart SDK3.运行二、Dart变量三、基本数据类型3.1Number3.2String3.3 Boolean3.4 List3.5 Set3.6 Map四、函数4.1 可选参数4.2默认无参数值4.3 mian函数4.4 匿名函数五、流程控制5.1 for循环5.2 switch case六、捕获异常七、多继承八、引入库九、异步支...

2019-08-12 14:57:57 143

原创 Flutter环境搭建

一、下载Flutter SDK beta版本1.Flutter官网下载最新Beta版本的进行安装:https://flutter.dev/docs/development/tools/sdk/releases2.Flutter github项目中去下载,地址为:https://github.com/flutter/flutter/releases。3.执行git命令:git clone -b...

2019-08-12 11:59:34 122

原创 SparkStreaming读取Socket数据

SparkStreaming是7*24h不间断运行,底层操作的是DStream。读取Socket数据过程1.SparkStreaming启动后,首先启动一个job,这个job有一个task一直接收数据。2.task每隔一段时间(batchInterval)就把接收来的数据封装到batch中。生成的每个batch又被封装到一个RDD中,这个RDD又被封装到DStream中。SparkStrea...

2019-07-31 08:42:54 679 1

原创 SparkStreaming和Storm的区别

SparkStreaming是流式处理框架,是Spark API的扩展,支持可扩展、高吞吐量、容错的实时数据流处理,实时数据的来源可以是:Kafka(Kafka和SparkStreaming是黄金组合), Flume, Twitter, ZeroMQ或者TCP sockets,并且可以使用高级功能的复杂算子来处理流数据。例如:map,reduce,join,window 。最终,处理后的数据可以存...

2019-07-31 08:16:10 209

原创 Spark 开窗函数

row_number() 开窗函数是按照某个字段分组,然后取另一字段的前几个的值,相当于 分组取topN如果SQL语句里面使用到了开窗函数,那么这个SQL语句必须使用HiveContext来执行,HiveContext默认情况下在本地无法创建。在MySql8之后也增加了开窗函数。开窗函数格式:row_number() over (partitin by XXX order by XXX)...

2019-07-31 08:04:22 429

原创 Spark UDAF用户自定义聚合函数

UDAF的特点就是:N:1,目的就是为了做聚合(group by)UserDefinedAggregateFunction是用户自定义聚合函数要继承的抽象类,传参---->initialize初始化、update(RDD分区内部的合并)、merge(分区之间总结果之间的合并)class MyUDAF extends UserDefinedAggregateFunction{ over...

2019-07-30 21:55:25 243

原创 Spark UDF用户自定义函数

自定义一个函数实现查询字符串长度。首先创建测试的DataFrame: val spark = SparkSession.builder().master("local").appName("UDF").getOrCreate() val nameList: List[String] = List[String]("zhangsan", "lisi", "wangwu", "zhaoliu...

2019-07-30 21:45:28 384

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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