<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[CHZKAL的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/CHZKAL</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; CHZKAL]]></copyright><item><title><![CDATA[ViewModel 源码设计思路分析]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/127749273</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/127749273</guid><author>CHZKAL</author><pubDate>Tue, 08 Nov 2022 14:17:12 +0800</pubDate><description><![CDATA[转眼一年又过去大半了，在2022年，初定了大多计划，搬家，换公司，很多事情都一托再拖。这里分享一篇我在公司内部做的分享文章吧，删除了部分对公司内部代码的探讨。公司中的项目运用到了大量的组件封装。有的是对第三方组件进行二次封装，有的是从零开始设计，如何设计一个可扩展性高，容易使用的组件呢？可以参考参考google开发者是如何设计组件的。我们以ViewModel组件为例，试图从源码中，窥探作者是如何设计ViewModel组件的。如果是我们，我们会怎么设计ViewModel组件呢？需求分析。]]></description><category></category></item><item><title><![CDATA[CoroutineExceptionHandler使用的踩坑日志]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/122870313</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/122870313</guid><author>CHZKAL</author><pubDate>Thu, 10 Feb 2022 22:15:42 +0800</pubDate><description><![CDATA[CoroutineScope作用域

下面这段使用coroutineScope作用域，在第7行launch中抛出了异常，即使在该launch的父协程，也就是coroutineScope的根协程设置了捕获（即第三行设置了捕获），也并不会执行该捕获。异常还是会向上传输给根作用域lifecycleScope中的根launch（即第一行的launch）。所以这里需要在第一行的launch那里，即在coroutineScope中，只有在根协程设置CoroutineExceptionHandler才有效。





.]]></description><category></category></item><item><title><![CDATA[双向循环链表 笔录]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/122559080</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/122559080</guid><author>CHZKAL</author><pubDate>Tue, 18 Jan 2022 14:23:37 +0800</pubDate><description><![CDATA[双向循环链表中，每个节点都有2个指针，分别指向前一个节点和后一个节点。

链表头有一个head，是空节点，head节点的前一个节点指向链表最后一个节点，链表最后一个节点的后一个节点是head节点。



查询的时候，如果index小于链表长度一半，从头开始查询，如果index长度大于链表长度一半，则从末尾开始查询。故，时间复杂度是O(n/2)

内存空间不一定是连续的，由于查询需要遍历每一个节点，并取获节点的next节点。遍历查询效率不如数组。但是中间的插入，删除的效率优于数组。

在java中，li...]]></description><category></category></item><item><title><![CDATA[Head First 设计模式笔录--观察者模式]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/122024037</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/122024037</guid><author>CHZKAL</author><pubDate>Sun, 19 Dec 2021 16:56:25 +0800</pubDate><description><![CDATA[观察者模式定义了一种一对多的依赖关系，当一个对象改变状态时，他的所有依赖者都会收到通知并更新数据。

比如我们常见的设置监听，button.setOnClickListener也算是观察者的一种。

核心关注点

观察者与被观察者是松耦合的，被观察者只需要知道，观察者都实现了统一的接口，都提供了update的方法。只要接口不变，改变任何一方的内容，都不会对另一方造成影响。

被观察者中持有观察者的list，发生数据变化就通知到list中的所有观察者，注意解除观察的时候及时移除观察者，避免内存泄漏.

气象站]]></description><category></category></item><item><title><![CDATA[Head First 设计模式笔录--策略模式]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/122010810</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/122010810</guid><author>CHZKAL</author><pubDate>Sat, 18 Dec 2021 13:43:09 +0800</pubDate><description><![CDATA[核心写法

创建一个策略接口，并创建不同的策略类实现该接口

创建一个基类，依赖策略接口（这里也符合面向接口编程）

在基类提供策略接口的set方法，由外部根据需求动态设置具体的策略类



关于鸭子的设计故事

文中关于鸭子的设计图：





抽象基类Duck，依赖了不同的接口，飞行的FlyBehavior 接口和叫的QuackBehavior接口。

这俩接口都拥有各自的实现类。

在Duck中提供了set方法，用来让子类对俩接口具体实例化，同时可以动态设置接口的具体实现。

将部分功能延迟到子类来.]]></description><category></category></item><item><title><![CDATA[如何指定JVM target 为1.8]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/121806454</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/121806454</guid><author>CHZKAL</author><pubDate>Thu, 09 Dec 2021 09:44:01 +0800</pubDate><description><![CDATA[新建项目，在使用kotlin总会报错，默认项目又没有指定好kotlin的JVM target。写的容易忘记，这里记录下，方便后续快速使用。


 kotlinOptions {
        jvmTarget = "1.8"
    }


]]></description><category></category></item><item><title><![CDATA[2021-10-15 Bad method handle type 7]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/120780280</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/120780280</guid><author>CHZKAL</author><pubDate>Fri, 15 Oct 2021 11:46:54 +0800</pubDate><description><![CDATA[2021年10月15日 填坑笔录

枫叶看着挺美的，但是一大片的红色，让我想起了下面这种情况，顿时就觉得，似乎不是那么美了。









今天创建了一个空的项目，准备了解下Retrofit的源码，刚刚引入


 implementation 'com.squareup.retrofit2:retrofit:2.9.0'

就报错了


 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.ba...]]></description><category></category></item><item><title><![CDATA[Handler同步屏障]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/117513915</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/117513915</guid><author>CHZKAL</author><pubDate>Thu, 03 Jun 2021 11:38:05 +0800</pubDate><description><![CDATA[首先需要发送一个特殊消息作为屏障消息，当消息队列检测到了这种消息后，就会从这个消息开始，遍历后续的消息，只处理其中被标记为“异步”的消息，忽略同步消息（所以叫“同步屏障”），相当于给一部分消息开设了“VIP”优先通道。




...]]></description><category></category></item><item><title><![CDATA[红米手机scrollView嵌套recyclerView只显示1个item填坑]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/116126693</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/116126693</guid><author>CHZKAL</author><pubDate>Sun, 25 Apr 2021 14:21:44 +0800</pubDate><description><![CDATA[项目需求最近需要在一个页面增加出价记录列表功能，ui图如下：



实现方法很多，我直接用的adapter添加footerView实现。

测试数据，item个数8个，设置超过3个就显示展开栏，否则隐藏展开栏。

展开栏是否显示的逻辑判断是判断item个数，其他手机，华为，oppo都是正常的，但是2台红米手机都无法显示正确的item个数，只显示了1个。并且不显示展开栏。

recyclerView的适配器用的第三方库BaseRecyclerViewAdapterHelper。

重点来了，在这个页面的布局中]]></description><category></category></item><item><title><![CDATA[jetpack学习笔录-WorkManager]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/114378973</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/114378973</guid><author>CHZKAL</author><pubDate>Fri, 12 Mar 2021 13:58:37 +0800</pubDate><description><![CDATA[WorkManager是一个API，用来调度任务，哪怕进程关闭或者设备重启都没事。这些任务是可延期的异步任务。

之所以关闭进程或者设备重启都没事，是因为已调度的工作都存储在SQLite中。



WorkManager是一个单例，获取方式:WorkManager.getINstance(this)



上图是使用WorkManager的流程
...]]></description><category></category></item><item><title><![CDATA[Jetpack学习笔录-ViewModel]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/113963669</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/113963669</guid><author>CHZKAL</author><pubDate>Sun, 28 Feb 2021 15:38:09 +0800</pubDate><description><![CDATA[ViewModel

简单来说，activity因为屏幕旋转这类问题导致activity被销毁重新创建的时候，数据会丢失。为了避免数据丢失的情况。可以把数据存储在ViewModel中。

来张官网的生命周期图感受下



注意啦：activity或fragment的作用范围从created到finished，你不能混淆销毁。请记住，当一个设备被旋转时，activity会被销毁，但是任何与它相关的ViewModel实例不会被销毁。

viewModel不可以存在上下文引用！会引发内存泄漏







...]]></description><category></category></item><item><title><![CDATA[Jetpack学习笔录-LifecycleObserver]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/113917683</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/113917683</guid><author>CHZKAL</author><pubDate>Sun, 21 Feb 2021 18:01:20 +0800</pubDate><description><![CDATA[lifecycle本身是一个抽象类，位于androidx.lifecycle包，该包下有一些列生命周期感知型的组件。

lifecycle主要用于存储有关组件的生命周期状态信息，比如activity,fragment,或者是整个应用的生命周期。

跟踪生命周期主要由：状态和事件 这两个表示。

来张官网的图感受一下





新建项目，创建一个新的empty Aactivity ，默认都是继承自AppCompatActivity的，查找其父类，发现ComponentActivity实现了Lifecycle.]]></description><category></category></item><item><title><![CDATA[Jetpack学习笔录-dataBinding]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/113839604</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/113839604</guid><author>CHZKAL</author><pubDate>Wed, 17 Feb 2021 23:32:12 +0800</pubDate><description><![CDATA[dataBinding

数据的双向绑定，使用dataBinding，在xml布局文件中·对指定的布局内容设置，当数据内容发生改变，自动更新到xml上，这配合LiveData使用。另外可以编写顶层函数，顶部增加@BindAdapter注解。


/**
 * A Binding Adapter that is called whenever the value of the attribute `android:progressTint`
 * changes. Depending on the value]]></description><category></category></item><item><title><![CDATA[android跨进程通信-AIDL]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/108564236</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/108564236</guid><author>CHZKAL</author><pubDate>Mon, 14 Sep 2020 01:35:46 +0800</pubDate><description><![CDATA[本篇主要记录内容：1、aidl基本使用

                2、in、 out 、inout、onway关键字含义

                3、aidl在使用时对线程的注意事项。跨进程通信时，是在本地的一个binder线程池中执行的。

                4、传递bundle对象时，需要注意的点

AIDL通信方式

在 Android 中，一个进程通常无法访问另一个进...]]></description><category></category></item><item><title><![CDATA[Unable to extract the trust manager on Android10Platform]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/106250966</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/106250966</guid><author>CHZKAL</author><pubDate>Thu, 21 May 2020 10:29:54 +0800</pubDate><description><![CDATA[无法在android10平台上提取信任管理器，sslSocketFactory是class com.android.org.conscrypt.OpenSSLSocketFactoryImpl。记录一下填坑内容。

服务器测试接口是http的，不是https，之前一直拿的8.0的手机调试一直好好的，今天换成android 10的手机测试发现请求服务器的时候奔溃了。，



网上这个问题比较少嘞，在此记录一下。

有大佬说这是okhttp的问题，解决方案是X509TrustManager改成X509Exte.]]></description><category></category></item><item><title><![CDATA[ARouter的compileDevDebugJavaWithJavac填坑记录日志]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/106050125</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/106050125</guid><author>CHZKAL</author><pubDate>Mon, 11 May 2020 11:25:25 +0800</pubDate><description><![CDATA[好好的项目突然运行起来报错：



build Output是：



完全看不出所以然，

看到下面这句：



在as控制台查看之后提示说子模块value文件，没在setting.gradle文件中配置，神特么无语。value文件和setting文件有几毛钱关系呢。

看看这优秀的提示：



经过网络各种搜索无果，最终决定用最简单的排除法。

在一步步排除改动的代码后，终于发现，ARouter中，参数传递的成员变量，不能是private的



上面这样就是错误的，改成Public即可。

as提..]]></description><category></category></item><item><title><![CDATA[unable to find valid certification path to requested target拉不了包处理]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/102508051</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/102508051</guid><author>CHZKAL</author><pubDate>Sat, 12 Oct 2019 01:19:49 +0800</pubDate><description><![CDATA[【最新】最新记录更新：2019-12-15，android studio版本3.5.3 。先说明一下，本篇文章最早是在10月份记录的，当时遇到的问题按照原来的方式确实解决了，但是后面又出现了这个问题，且一直无法解决，现在是最新的解决方案！！！！！而且！！！！我百度，google,stack overflow各种途径都看了，目前还没看到有又相同的方案。下面直接进入主题：

很多人说证书不被信任...]]></description><category></category></item><item><title><![CDATA[NestedScrollView中嵌套recyclerView的焦点问题]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/99452499</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/99452499</guid><author>CHZKAL</author><pubDate>Tue, 13 Aug 2019 17:29:17 +0800</pubDate><description><![CDATA[思路：一开始认为是adapter刷新数据，调用notifyDataSetChanged的时候获取了焦点，所以显示为置顶，那我就在刷新数据后延时1.5秒在去设置nestedScrollView滑动到底部。即调用下面：


ScrollView.fullScroll(View.FOCUS_UP);

然并软。

后来神奇的觉得，会不会是滑动冲突了，于是又在xml文件的recyclerView...]]></description><category></category></item><item><title><![CDATA[AAPT2 error:com.android.tools.aapt2.Aapt2Exception]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/99289431</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/99289431</guid><author>CHZKAL</author><pubDate>Mon, 12 Aug 2019 10:11:56 +0800</pubDate><description><![CDATA[直接上问题：接手同事项目编译后这样了~



处理方法：升级到3.2.0或者更高就可以了


]]></description><category></category></item><item><title><![CDATA[compileDebugJavaWithJavac]]></title><link>https://blog.youkuaiyun.com/CHZKAL/article/details/98488602</link><guid>https://blog.youkuaiyun.com/CHZKAL/article/details/98488602</guid><author>CHZKAL</author><pubDate>Mon, 05 Aug 2019 15:04:59 +0800</pubDate><description><![CDATA[Glide添加高斯模糊的时候，突然出现。找了代码、Logcat、run都没看出问题在哪里。最后网上找到解决方法记录一下~：

输入：

就能看到问题所在。




...]]></description><category></category></item></channel></rss>