<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[gg199402的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/gg199402</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; gg199402]]></copyright><item><title><![CDATA[Android DI框架-Hilt]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/127834377</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/127834377</guid><author>gg199402</author><pubDate>Wed, 18 Oct 2023 16:36:27 +0800</pubDate><description><![CDATA[是一种思想，并不是特指一种技术实现，目的是要解决Java 开发领域，对象的创建以及管理的问题，是一种软件设计思想。控制：指的是对象创建（实例化、管理）的权力。在哪里创建，由‘’谁”创建反转：控制权交给外部环境（Spring 框架、IoC 容器传统的开发方式：当一个类里面需要用到很多个成员变量时。传统的写法，这些成员变量，都需要new出来！使用 IOC 思想的开发方式。]]></description><category></category></item><item><title><![CDATA[Lifecycle你真的懂了吗？]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/123926970</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/123926970</guid><author>gg199402</author><pubDate>Wed, 06 Apr 2022 13:12:32 +0800</pubDate><description><![CDATA[Lifecycle生命周期感知型组件，用来执行操作来响应另一个组件（如 Activity 和 Fragment）的生命周期状态的变化。
本文Lifecycle版本为2.2.0：

implementation ‘androidx.lifecycler:lifecycle-common:2.2.0’  //22.2.23 更新 2.5  ，2.2是用的比较多的版本

你真的了解Lifecycle了吗？
Lifecycle使用非常非常简单。默认你已经使用过Lifecycle。但如果我问你以下几个问题。你能回答出]]></description><category></category></item><item><title><![CDATA[全方位解析-Android中的线程池]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/123599521</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/123599521</guid><author>gg199402</author><pubDate>Sun, 20 Mar 2022 16:22:21 +0800</pubDate><description><![CDATA[笔记文章，没有废话，句句关键

线程池的优点

重用线程池里的线程，避免创建和销毁线程所带来的性能开销
有效控制最大并发数，避免造成线程间抢占系统资源而造成阻塞
提高线程可管理性，可以统一进行分配，调优和监控的能力

Android中的线程池
复用Java中的Executor接口，具体实现类为ThreadPoolExecutor，它有一下几个参数：




参数
说明
注释




corePoolSize
线程池中核心线程数量
一直存活，即使处于闲置状态


maximumPoolSize
最大能创建的.]]></description><category></category></item><item><title><![CDATA[一图抵千言《ARouter简明扼要原理分析》]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/123408036</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/123408036</guid><author>gg199402</author><pubDate>Fri, 11 Mar 2022 17:52:22 +0800</pubDate><description><![CDATA[配置
Kotlin项目:
module App：
apply plugin: 'kotlin-kapt'

defaultConfig{
 javaCompileOptions {
   annotationProcessorOptions {
   //AROUTER_MODULE_NAME必配项 用于拼接生成文件名 AROUTER_GENERATE_DOC 
   // AROUTER_GENERATE_DOC = enable 生成Json文档
   // 生成的文档路径 : build/genera]]></description><category></category></item><item><title><![CDATA[Navigation深入浅出，到出神入化，再到实战改造(三)]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/123357964</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/123357964</guid><author>gg199402</author><pubDate>Wed, 09 Mar 2022 01:36:23 +0800</pubDate><description><![CDATA[改造Navigation
目标：

摒弃xml文件，用注解的方式管理路由节点。利用映射关系，动态生成路由节点配置文件
改造FragmentNavigator,替换replace(),使用show(),hint()方式，路由Fragement

自定义注解处理器
1. 配置
gradle配置
//生成Json文件工具类
api 'com.alibaba:fastjson:1.2.59'
//注解处理器配置工具 
api 'com.google.auto.service:auto-service:1.0-rc6]]></description><category></category></item><item><title><![CDATA[Navigation深入浅出，到出神入化，再到实战改造(二)]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/123352998</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/123352998</guid><author>gg199402</author><pubDate>Wed, 09 Mar 2022 01:22:30 +0800</pubDate><description><![CDATA[这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题，有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能，丰富你的文章UML 图表FLowchart流程图导出与导入导出导入
欢迎使用Markdown编辑器
你好！ 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar]]></description><category></category></item><item><title><![CDATA[Navigation深入浅出，到出神入化，再到实战改造]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/123342863</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/123342863</guid><author>gg199402</author><pubDate>Mon, 07 Mar 2022 23:51:51 +0800</pubDate><description><![CDATA[思考几个问题：

可以在代码中用Bundle传递参数，为什么要在XML去配置
XML中的参数标签，只能设置和读取，到时无法在XML中跳转是附带传过去，如B页面要求传入name:String,于是在标签中配置，但A去跳转时，无法在XML中传入，只能在代码中定义参数名称和值，那么XML的参数还有何意义？有什么实用的场景？
navigationUp和popBackStack()回退上一级时有什么区别，该如何正确实用
跳转时 有时用的是Action的ID，有时用的是Fragment的ID 他俩到底在什么场景下，区分]]></description><category></category></item><item><title><![CDATA[读书笔记--Android系统启动]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/107474839</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/107474839</guid><author>gg199402</author><pubDate>Mon, 20 Jul 2020 21:47:20 +0800</pubDate><description><![CDATA[本文为读书和博客学习笔记，记录将知识总结自己理解的方式。可能存在错误。文末会给出相关参考链接
1. Android系统概括
1.1 Android系统架构整体认识

上图可以看出，Android系统大致可以分为5层(这个分层是主观的，并不准确)，自顶向下依次介绍。

应用层(System APP)

这一层主要就是系统APP和非系统APP(也就是开发者开发的APP，如抖音，微信等)主要是Kotlin + Java

框架层(Java API Framework)

供应用层直接调用的Java API,系统A]]></description><category></category></item><item><title><![CDATA[归并排序 O(nLogn)]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/107474827</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/107474827</guid><author>gg199402</author><pubDate>Mon, 20 Jul 2020 21:46:12 +0800</pubDate><description><![CDATA[归并排序
归并排序的思想是分治法+回溯，将一个无序的数组先按照原来的一半进行拆分，一直拆分到最后一个元素，然后开始回溯，排序开始的过程是再回溯时开始排序的。

思想总结：

将源数组进行拆分，每次拆分一半，由图可以分析出，当arr.length=n,需要拆分log2^8=3次。
当拆分到不能再拆分，也就是分组到每个组只有1个元素，停止拆分
开始排序并回溯排序，每次排序的时间复杂度为O(n)
总的时间复杂度为n x log2^n,时间复杂度不考虑系数和底数，所以n x log2^n等价于 O(nlogn)

]]></description><category></category></item><item><title><![CDATA[快速排序]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/107474807</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/107474807</guid><author>gg199402</author><pubDate>Mon, 20 Jul 2020 21:45:35 +0800</pubDate><description><![CDATA[快速排序思想
快速排序号称20世纪最伟大的十大算法之一，也是nlogn级别的排序算法，它的思想是类似冒泡排序，是一种交换排序，同时加入分治法。

上图中我们选取待排序数组第一个元素为基准元素，通过比较交换，将比基准元素小的元素放在左边，比基准元素大的放在右边。那么此时基准元素(紫色元素)，就放在了最终排序后数组应该在的位置。然后通过同样的方式，将左边(绿色)和右边(橙色)部分排序。过称如下：

每轮分成3个步骤：

选取基准元素
基准元素方法排好序后的位置
继续拆分，直到剩下一个待排序元素

如何编码 ？
]]></description><category></category></item><item><title><![CDATA[数据结构与算法 基础排序(O(n^2))]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/107474795</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/107474795</guid><author>gg199402</author><pubDate>Mon, 20 Jul 2020 21:45:03 +0800</pubDate><description><![CDATA[选择排序

1. 选择排序思想：

开始将i=0，作为最小值minIndex开始
与剩下的所有值比较
如果比minIndex对应位置的值还小，交换位置
当minIndex与后面所有的值比较后，此时minIndex对应的值就是最小值
将minIndex与 i(表示现在排序到那个位置) 交换位置

2. 代码实现
    public static void selectSort(int[] arr){
        if(arr.length==0)
            return;
        ]]></description><category></category></item><item><title><![CDATA[Android中的AES加密-下]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/107474775</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/107474775</guid><author>gg199402</author><pubDate>Mon, 20 Jul 2020 21:44:15 +0800</pubDate><description><![CDATA[本文为笔记，记录，写记录后为了方便查阅也为了能更好的记住
参考
什么是AES算法？
前言
本章主要是针对AES加密的原理过程进行梳理。不在于细节，了解各个参数和类的功能来帮助我们再加密是更好的选择如何使用加密。
1. 加密过程
1.1 机密核心代码(包含但不仅紧限于)

这段代码上文中我们也说过了，大致的核心加密过程就是这些，只不过，在Android要适配不同版本对应的SecureRandom获取方式不同和用KeyStore存储密钥。(SecureRandom这个类其实相当与加盐，将原文密钥经过一些特定的随]]></description><category></category></item><item><title><![CDATA[Android中的AES加密--上]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/107474735</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/107474735</guid><author>gg199402</author><pubDate>Mon, 20 Jul 2020 21:43:33 +0800</pubDate><description><![CDATA[前言
最近需要一个加密一下用户信息，想到用到AES，加密，没想到苦难重重。
第一版
随便上晚上找了一下代码如下：
  //偏移量
    public static final String VIPARA = "1234567876543210";   //AES 为16bytes. DES 为8bytes
    //编码方式
    public static final String CODE_TYPE = "UTF-8";
    //填充类型
    public static final Str]]></description><category></category></item><item><title><![CDATA[一天入门Kotlin学习笔记(七)-泛型]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/103603341</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/103603341</guid><author>gg199402</author><pubDate>Wed, 18 Dec 2019 19:30:36 +0800</pubDate><description><![CDATA[文章目录前言逆变与协变Kotlin中的协变与逆变协变  :泛型类型与实参的类型的继承关系相同逆变 泛型参数的继承关系与类的继承关系相反不变 类型必须保持一致 泛型之间没有关系星投影 其本质就是类似Java中通配符 ？reified 关键字inline关键字的作用结语
前言
这节我们说下Kotlin的泛型。首先默认大家对Java泛型有个基本的认识，如果 不熟悉Java的泛型，可以阅读文章，或是看下J...]]></description><category></category></item><item><title><![CDATA[一天入门Kotlin学习笔记(六)-反射]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/103603331</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/103603331</guid><author>gg199402</author><pubDate>Wed, 18 Dec 2019 19:30:19 +0800</pubDate><description><![CDATA[文章目录前言在Kotlin中调用JavaApi实现反射1. 获取Class类2. 在Kotlin中使用Java反射API3. 在Kotlin中利用Java反射获取Kotlin类中的成员使用Kotlin反射库来实现反射反射的缺点结语
前言
这一节为Kotlin反射，主要是在Kotlin中时用Java-Api来实现反射，使用Kotlin本身支持的反射API进行反射。还有2者的对比。要是对Java的反射...]]></description><category></category></item><item><title><![CDATA[一天入门Kotlin学习笔记(五)-常见高阶函数]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/103576753</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/103576753</guid><author>gg199402</author><pubDate>Tue, 17 Dec 2019 11:08:09 +0800</pubDate><description><![CDATA[文章目录前言mapflatmapreducefoldjoinToStringfilter/takeWhile尾递归优化闭包复合函数柯里化函数(currying) -函数的链式调用偏函数结语
前言
这一节我们主要说下Kotlin中关于数据集合中的常用高阶函数
map
map是遍历一个数组遍历的过程可以对数组item进行操作(筛选、数据转换等) ,返回一个新的数据集合
例子：
 val list = ...]]></description><category></category></item><item><title><![CDATA[一天入门Kotlin学习笔记(四)-面向对象]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/103576734</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/103576734</guid><author>gg199402</author><pubDate>Tue, 17 Dec 2019 11:07:49 +0800</pubDate><description><![CDATA[文章目录前言接口抽象类可见性修饰符object类关键字伴生对象与静态成员方法重载扩展方法属性代理数据类内部类枚举类密封类结语
前言
本章将讲解一些管对对象和基础编程的知识。如：类，接口，抽象类，数据类，扩展方法等
接口
其实这部分的设计思路和Java基本一致。这里主要说下Kotlin特有的属性
abstract class Manager : Driver, Writer {
    overri...]]></description><category></category></item><item><title><![CDATA[一天入门Kotlin学习笔记(三)-程序结构(下 )]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/103527558</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/103527558</guid><author>gg199402</author><pubDate>Fri, 13 Dec 2019 15:05:18 +0800</pubDate><description><![CDATA[文章目录前言操作符重载(运算符重载)表达式(中缀表达式，分支表达式，when表达式)默认参数 变长参数 具名参数结语
前言
继续讲下程序结构，这部分相对简单，有时候可能会比较啰嗦，笔记嘛！就是在学习过程中我遇到的问题，作为记录。大家没有遇到问题更好。有些是个人理解，有更好的理解欢迎在评论。
操作符重载(运算符重载)
这部分官网还是比较好理解的，而且还是中文操作符重载建议去看下 举例：
class ...]]></description><category></category></item><item><title><![CDATA[一天入门Kotlin学习笔记(二)-程序结构(上 )]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/103527539</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/103527539</guid><author>gg199402</author><pubDate>Fri, 13 Dec 2019 15:04:52 +0800</pubDate><description><![CDATA[文章目录前言常量与变量函数Lambda表达式成员方法和成员变量结语
前言
上节我们主要讲了Kotlin的数据类型，这节我们主要从程序结构，包括方法，类成员，运算符的角度去认识Kotlin
常量与变量
上一节我们已经用到了用val，var来修饰属性。这节我们详细总结下：

常量(val)

val=value,值类型
类似Java的final
不可能重复赋值
运行时常量: val x = getX(...]]></description><category></category></item><item><title><![CDATA[一天入门Kotlin学习笔记(一)-数据类型]]></title><link>https://blog.youkuaiyun.com/gg199402/article/details/103527300</link><guid>https://blog.youkuaiyun.com/gg199402/article/details/103527300</guid><author>gg199402</author><pubDate>Fri, 13 Dec 2019 14:57:28 +0800</pubDate><description><![CDATA[文章目录前言推荐学习资料数据类型1. Boolean类型2. Number类型3. Char类型4. String类型5. 类与对象6. 空类型7. 智能类型转换8. 区间9. 数组结语
前言
本系列文章作为学习简单的学习笔记，其目的在于2个：

记录自己学过的知识
本着分享交流的原则分享

本系列适合完全没有学过Kotlin并且像快速入门的同学，本人现在也是在学习中，所以作为笔记难免会有错误，如...]]></description><category></category></item></channel></rss>