<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[jerechen的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/jerechen</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; jerechen]]></copyright><item><title><![CDATA[【面试 反思】Retrofit源码与设计 7 连问]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/121751692</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/121751692</guid><author>jerechen</author><pubDate>Tue, 21 Dec 2021 16:47:41 +0800</pubDate><description><![CDATA[Retrofit 采用 RESTful 风格，本质上只是对 OkHttp 进行封装，今天我们根据几个问题来进一步学习一下 Retrofit的源码与设计思想。]]></description><category></category></item><item><title><![CDATA[日常工作中常用的几个git指令]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/121629028</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/121629028</guid><author>jerechen</author><pubDate>Thu, 02 Dec 2021 15:14:46 +0800</pubDate><description><![CDATA[前言
组内分享
基础概念
git有三个分区，分别是：

工作区（Working Directory）：开发者直接编辑的地方，只要文件发生了更改，在这就会显示出来，包含追踪与未追踪文件。通过git add将工作区文件添加到暂存区。
暂存区（Stage | Index）：数据暂时存放的区域，通过git commit将暂存区文件添加到本地版本库。
本地版本库（Local Commit History）：存放所有已经提交的数据，通过git push推送到远程仓库。


基础命令
git status
查看工作区状态]]></description><category></category></item><item><title><![CDATA[OkHttp源码解析（很细 很长）]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/121375045</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/121375045</guid><author>jerechen</author><pubDate>Mon, 22 Nov 2021 16:34:11 +0800</pubDate><description><![CDATA[使用方法
使用方法十分简单，分别创建一个OkHttpClient对象，一个Request对象，然后利用他们创建一个Call对象，最后调用同步请求execute()方法或者异步请求enqueue()方法来拿到Response。
	private final OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
      .url("https://github.com/")
      .b]]></description><category></category></item><item><title><![CDATA[EventBus 源码解析]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/121142077</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/121142077</guid><author>jerechen</author><pubDate>Fri, 05 Nov 2021 16:47:11 +0800</pubDate><description><![CDATA[使用方法
使用方法很简单，按照官方文档介绍，分为三个步骤。
步骤1：定义事件
public static class MessageEvent { }

步骤2：准备订阅者
定义订阅方法，来处理收到的事件。
@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {/* Do something */};

并在Activity、Fragment中按照其生命周期进行注册与注销。
 @O]]></description><category></category></item><item><title><![CDATA[如何在Adapter中正确的使用Context]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/113086906</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/113086906</guid><author>jerechen</author><pubDate>Sun, 31 Jan 2021 23:47:21 +0800</pubDate><description><![CDATA[前言
最近我在项目中，发现一个同事写 RecyclerView.Adapter 的时候都习惯定义一个全局的私有 mContext，然后在 onCreateViewHolder(parent: ViewGroup, viewType: Int) 方法中进行赋值操作 mContext = parent.context。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wzo0BlR5-1611468169753)(#pic_center)]



第一次见到这样的写法，
三种方式
]]></description><category></category></item><item><title><![CDATA[Android Volatile 关键字学习]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/110280642</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/110280642</guid><author>jerechen</author><pubDate>Tue, 08 Dec 2020 16:51:43 +0800</pubDate><description><![CDATA[面试官：你平时是怎么创建单例的？
我：我一般用DCL双重检锁的方式来创建单例，然后为 instance 加上 volatile 修饰，防止 DCL 失效。
面试官：那你可以具体说说 volatile 吗？
我：行！

前言
相信很多 Andorid程序员跟我一样，最开始接触到 volatile 这个关键字是在创建单例的时候，如：
public class SingleTon {
    //为了防止出现 DCL失效问题，加上 volatile 关键字
    private static volatile.]]></description><category></category></item><item><title><![CDATA[Android Synchronized 关键字学习]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/109660786</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/109660786</guid><author>jerechen</author><pubDate>Tue, 24 Nov 2020 23:56:16 +0800</pubDate><description><![CDATA[面试官：能说说Synchronized的作用吗？
答：Synchronized 使用于多线程并发环境下，确保线程间互斥的访问同步代码；确保线程间的共享变量的可见性；还是避免重排序导致的问题。

1. 多线程知识点回顾
Java 并发的5条特性
2. Synchronized 的使用方法
2.1 修饰普通方法
2.2 修饰静态方法
2.3 修饰代码块

...]]></description><category></category></item><item><title><![CDATA[Flutter 案例 实现 Wanandorid 客户端]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/108891461</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/108891461</guid><author>jerechen</author><pubDate>Thu, 01 Oct 2020 22:22:32 +0800</pubDate><description><![CDATA[本文分享利用Flutter实现 Wanandroid 客户端


]]></description><category></category></item><item><title><![CDATA[Android Xml解析]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/107707755</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/107707755</guid><author>jerechen</author><pubDate>Fri, 31 Jul 2020 20:13:17 +0800</pubDate><description><![CDATA[1. 什么是XML
XML (Extensible markup language):  XML是一种标记语言，用于存储与传输数据。是常用的数据传输方式，区分大小写，文件扩展名为.xml。XML定义了一组用于以人类可读和机器可读的格式编码文档的规则。XML的设计目标集中在Internet的简单性，通用性和可用性上。它是一种文本数据格式，并通过Unicode对不同的人类语言提供了强大的支持，被W3C所推荐。
例如：
&lt;?xml version="1.0" encoding="utf-8"?&gt;

&]]></description><category></category></item><item><title><![CDATA[Android刘海屏适配]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/107003887</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/107003887</guid><author>jerechen</author><pubDate>Sun, 28 Jun 2020 23:33:23 +0800</pubDate><description><![CDATA[代码生涯的第一个开源库，NotchAdapter 欢迎大家点评 Star

1.前言

自从2017年 iphone X 问世，刘海屏幕（Notch Screen）也开始流行。但是正如上图官方文档所介绍的，Android 官方是从 Android P （Android 9 API 28）开始才正式开始支持刘海屏幕的适配。也就造成了 “上面老大哥还没定好统一的规章制度，下面各个小弟已经开始各行其道了”的形象。
所以针对 Android 手机刘海屏的适配方案，我们需要分为Android 9及以上与Androi.]]></description><category></category></item><item><title><![CDATA[升级gradle 4.0.0 出现Unable to find method org.gradle.api.tasks.TaskInputs.file]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/106766763</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/106766763</guid><author>jerechen</author><pubDate>Mon, 15 Jun 2020 17:09:34 +0800</pubDate><description><![CDATA[今日将Android Studio 升级到了4.0，同时也将 Gradle 升级到了 4.0.0。项目配置如下：
project 下的 build.gradle
dependencies {
    classpath 'com.android.tools.build:gradle:4.0.0' //升级到了4.0.0
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    classpath 'org.gr]]></description><category></category></item><item><title><![CDATA[Android 设计模式之代理模式]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/106457797</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/106457797</guid><author>jerechen</author><pubDate>Sun, 31 May 2020 23:11:34 +0800</pubDate><description><![CDATA[本文是自己关于代理模式的一篇学习笔记，参考于 Android 源码设计模式解析与实战

文章目录1. 定义1.1 代理模式的UML类图1.1.1 代理模式的代码结构2. 代理模式的简单实现2.1 具体代码
1. 定义
当我们无法或不想直接访问某个对象或访问某个对象存在困难的时候，我们可以通过委托代理一个对象来间接访问，所以代理模式也称为委托模式。
1.1 代理模式的UML类图


Subject: 抽象主题类， 用于声明真实主题与代理主题的共同接口方法，可以是一个抽象类也可以是一个接口。
RealSubj.]]></description><category></category></item><item><title><![CDATA[GreenDao实现一个本地论坛]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/105871712</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/105871712</guid><author>jerechen</author><pubDate>Thu, 30 Apr 2020 23:35:38 +0800</pubDate><description><![CDATA[前言：

4月，换了工作，要适应新的工作新的环境，也比之前忙碌，立下的每个月至少一篇Blog，现转眼就到了4月份的最后一刻，但就是不知道写点什么好，但是还是想着要达成这个Flag。划个水了。

关于 Android 数据库，之前项目接触的都是 SQLite 与 Room DB，上次面试被问有没有用过 GreenDao？回答：没有！这次就记录一下近期关于 GreenDao 的学习实践，利用 Gree...]]></description><category></category></item><item><title><![CDATA[Android 网络请求是选择Retrofit + RxJava2 还是 Retrofit + Callback?]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/105079791</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/105079791</guid><author>jerechen</author><pubDate>Tue, 24 Mar 2020 22:11:01 +0800</pubDate><description><![CDATA[文章目录1.前言2.实例2.1 Retrofit + Callback2.2 Retrofit + RxJava23.总结
1.前言
在我们的App中，肯定需要通过网络请求从后台服务器获取一些数据，这时就需要用到网络请求框架，当下最流行的网络框架应当就是 Retrofit 网络框架了，我在实际项目中也都是使用 Retrofit，是采用 Retrofit + Callback的形式。我还以为大家都是...]]></description><category></category></item><item><title><![CDATA[我一次性为 Wanandroid 开发了Java与Kotlin两个版本]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/105006700</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/105006700</guid><author>jerechen</author><pubDate>Sat, 21 Mar 2020 13:59:21 +0800</pubDate><description><![CDATA[目录1. 介绍1.1 功能效果图展示1.2 项目设计模式2. 代码解析
1. 介绍
最近基于 Wanandroid开放API 开发了一款十分简单的APP，, 采用 Androidx + MVVM + Retrofit + dataBinding 的模式进行开发。App的主要功能是就是浏览各类 Android 文章，效果图如下所示：
1.1 功能效果图展示


1.2 项目设计模式

该项目采用 M...]]></description><category></category></item><item><title><![CDATA[Android IntentService详解（源码分析）]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/104119543</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/104119543</guid><author>jerechen</author><pubDate>Sat, 01 Feb 2020 14:17:24 +0800</pubDate><description><![CDATA[1. 前言
1.1 定义
2.使用方法
3.源码分析

]]></description><category></category></item><item><title><![CDATA[Android HandlerThread详解（源码分析）]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/104080237</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/104080237</guid><author>jerechen</author><pubDate>Tue, 28 Jan 2020 22:39:19 +0800</pubDate><description><![CDATA[1. 前言
本篇文章是对 Android HandlerThread 类的学习，通过简单的例子，及分析源码来深入学习。同时例子将以 Java &amp;&amp; Kotlin 两种代码形式展示。
1.1 定义

HandlerThread： 一个拥有 Looper 对象的线程。

继承于 Thread 类，并拥有一个 Looper 对象，可以利用该 Looper 对象来创建 Handler 对象...]]></description><category></category></item><item><title><![CDATA[Android AsyncTask深入学习（源码分析）]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/104025123</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/104025123</guid><author>jerechen</author><pubDate>Sun, 19 Jan 2020 23:48:49 +0800</pubDate><description><![CDATA[之前有写过一篇博客，关于Android AsyncTask使用方法 AsyncTask 的使用方法，想着不能又是知其然不知其所以然的状态，本篇文章是对 AsyncTask 的深入学习。
目录：


AsyncTask 是一种轻量级的任务异步类，可以在后台子线程执行任务，且将执行进度及执行结果传递给 UI 线程。

1. AsyncTask 官方文档介绍
AsyncTask 的官方文档中有很详细的介...]]></description><category></category></item><item><title><![CDATA[Android Messenger初探]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/103935657</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/103935657</guid><author>jerechen</author><pubDate>Sat, 11 Jan 2020 16:23:48 +0800</pubDate><description><![CDATA[1. 背景

最近在看任玉刚老师的《Android开发艺术探索》，看到了 Messenger，觉得挺有意思的，写个 Demo 练习一下，同时根据 Messenger 可以延伸到其他知识点，比如Android的Binder通信机制，AIDL等知识点，本文算是 Messenger 初探。

1.1 Messenger 介绍
首先肯定要看一下官方对于 Messenger 的介绍。
/**
 * 引用 H...]]></description><category></category></item><item><title><![CDATA[Android Handler深入学习（源码分析）]]></title><link>https://blog.youkuaiyun.com/jerechen/article/details/103776722</link><guid>https://blog.youkuaiyun.com/jerechen/article/details/103776722</guid><author>jerechen</author><pubDate>Sun, 05 Jan 2020 21:00:08 +0800</pubDate><description><![CDATA[1. 背景
1.1 Message

定义：Message 是包含着描述信息及任意数据对象的可发送到 Handler 的信息。

/**
 * 定义包含着描述信息及任意数据对象的可发送到 Handler 的信息。额外包含可以不被分配的两个
 * int 字段及一个 对象字段。获取Message最好的方法是调用 Message.obtain() 或 调用 
 * Handler.obtainMess...]]></description><category></category></item></channel></rss>