<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ApkCore的专栏]]></title><description><![CDATA[学海无涯，从头开始]]></description><link>https://blog.youkuaiyun.com/ApkCore</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ApkCore]]></copyright><item><title><![CDATA[Kotlin之心路历程]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/100986911</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/100986911</guid><author>ApkCore</author><pubDate>Wed, 18 Sep 2019 16:13:22 +0800</pubDate><description><![CDATA[Kotlin之心路历程

以小白眼光看kotlin

kotlin这个小丫鬟被谷歌扶正为大房两年，期间看过不少博文，很多人也已经把个人项目迁移到kotlin了，当然国外的开发者更给力，直接大部企业开发已经kotlin，也订阅了涛哥的极客时间（一直没时间看，果然看视频太费事，还是文章可以抽得时间挤一挤学），一直是不想学习啊，一个人的惰性就是这样，java又不是不能用，代码通俗易懂。说句心里话，jav...]]></description><category></category></item><item><title><![CDATA[MQTT的极速搭建与验证]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/100540674</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/100540674</guid><author>ApkCore</author><pubDate>Thu, 05 Sep 2019 10:13:43 +0800</pubDate><description><![CDATA[mqtt服务端
网上貌似已经找不到apache-apollo-1.7.1的官网下载地址了，不过我废了挺大劲还是找到了。。。这里提供apache官网的镜像下载地址：http://archive.apache.org/dist/activemq/activemq-apollo/1.7.1/。
安装

以在windows为例，在cmd中先cd到bin目录下，然后执行apollo crate test(名...]]></description><category></category></item><item><title><![CDATA[重学设计模式——代理模式之手写JDK动态实现]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/93667529</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/93667529</guid><author>ApkCore</author><pubDate>Tue, 25 Jun 2019 22:52:03 +0800</pubDate><description><![CDATA[代理模式
为其他对象提供一种代理以控制对这个对象的访问。
最重要的三要素：

有执行者、被代理人
对被代理人来说，这件事是一定要去做，但是自己因为某些原因暂时不能去做，只能通过代理来做
代理能获取到被代理人的资料（拿到被代理人的引用）

动态代理
动态代理通过反射机制动态地生成代理者的对象，我们在code的时候不必要关心代理谁，代理谁我们将在执行阶段来决定。JDK为我们已提供了很方便的动态代理接口...]]></description><category></category></item><item><title><![CDATA[关于链表的常见算法题(二)]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/92746751</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/92746751</guid><author>ApkCore</author><pubDate>Mon, 17 Jun 2019 23:18:33 +0800</pubDate><description><![CDATA[关于链表的常见算法题(二)
从有序链表中删除重复的节点

给定一个有序链表，请删除其中的重复元素，使得这个元素仅出现一次

Input: 1-&gt;1-&gt;2-&gt;3-&gt;3
Output: 1-&gt;2-&gt;3

其实这个题比上篇讲的https://juejin.im/post/5d067f4ee51d4577596486fb#heading-5中删除重复的节点还要容易一些，...]]></description><category></category></item><item><title><![CDATA[关于链表的常见算法题(一)]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/92463197</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/92463197</guid><author>ApkCore</author><pubDate>Mon, 17 Jun 2019 01:45:23 +0800</pubDate><description><![CDATA[关于链表的常见算法题(一)
链表一直是面试最喜欢考的数据结构，灵活而又多变，代码往往也不是特别长。
从尾到头打印链表
链表一直是面试最喜欢考的数据结构，灵活而又多变，代码往往也不是特别长。

输入一个链表的头节点，从尾到头反过来打印出每个节点的值

例如链表为1-&gt;2-&gt;3，打印出3 2 1
有三种思路可以参考：

栈：栈天然是先进后出的，在遍历链表时，把值按顺序放入栈中，最后出栈就是...]]></description><category></category></item><item><title><![CDATA[重学设计模式——线程安全的观察者模式]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/92233811</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/92233811</guid><author>ApkCore</author><pubDate>Sat, 15 Jun 2019 23:16:28 +0800</pubDate><description><![CDATA[线程安全的观察者模式
先来说下观察者模式，其实在Android开发中，我们使用观察者模式的时候还是非常多的，无论是广播使用的发布-订阅模式，还是listview的notifyDataSetChanged，或者是RxJava的使用，都是观察者模式的运用。今天就来重新看一下观察者模式。
概念
订阅模式，又称观察者模式。定义对象间一种一对多的依赖关系（注册），使得当一个对象改变状态后，则所有依赖它的对象...]]></description><category></category></item><item><title><![CDATA[重学Android——Glide4.x源码分析(2)]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/92016656</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/92016656</guid><author>ApkCore</author><pubDate>Fri, 14 Jun 2019 22:54:33 +0800</pubDate><description><![CDATA[Glide的加载流程
接上文重学Android——Glide4.x源码分析(1)
执行加载主流程
接上一文，昨天讲到图片加载，最终调用到了onSizeReady的方法，调用了其中的engine.load方法
  @Override
  public synchronized void onSizeReady(int width, int height) {
    stateVerifier.th...]]></description><category></category></item><item><title><![CDATA[重学Android——Glide4.x源码分析(1)]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/91917729</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/91917729</guid><author>ApkCore</author><pubDate>Fri, 14 Jun 2019 01:37:52 +0800</pubDate><description><![CDATA[Glide4.x
先来说下世面上常用的三种图片加载框架Picasso，Glide，Fresco
Picasso与Glide相比：

相似——api上的调用差不多，都支持内存缓存，glide是picasso的升级，性能有一定的提升
差异

缓存不同，picasso2级缓存，没有磁盘缓存，Glide三级缓存，内存-磁盘-网络的优先级加载黑乎乎。
Picasso默认加载的图片格式是ARGB-8888，G...]]></description><category></category></item><item><title><![CDATA[重学Android——OkHttp3源码解读]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/91642059</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/91642059</guid><author>ApkCore</author><pubDate>Wed, 12 Jun 2019 22:29:36 +0800</pubDate><description><![CDATA[OkHttp3
官网的介绍——An HTTP &amp; HTTP/2 client for Android and Java applications。
它的优点：

支持http2，对一台机器的所有请求共享同一个socket
支持连接池，支持连接复用，减少延迟
支持透明gzip压缩响应体
通过缓存避免重复的请求
请求失败时自动重试主机的其他ip，自动重定向
API调用方便

OkHttp的使用...]]></description><category></category></item><item><title><![CDATA[重学Android——Rxjava2.x源码解析]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/91488503</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/91488503</guid><author>ApkCore</author><pubDate>Wed, 12 Jun 2019 01:49:19 +0800</pubDate><description><![CDATA[Rxjava的诞生背景
首先要从异步编程说起，最开始的原生的系统中，如果UI系统处理耗时任务，会引发ANR，所以都是放在子线程做耗时任务，比如网络请求或者IO操作，再来更新UI界面，这需要在主线程来完成，这样就涉及到了异步编程。
最开始的异步编程主要有：

使用Java自身提供的Future模型

但这种异步结果获取比较困难，必须调用Future.get()，回去查看异步是否完成，如果完成，就返回...]]></description><category></category></item><item><title><![CDATA[重学Java——Synchronized底层实现原理]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/91410346</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/91410346</guid><author>ApkCore</author><pubDate>Tue, 11 Jun 2019 00:48:53 +0800</pubDate><description><![CDATA[深入Synchronized底层原理
对于synchronized大家应该都很熟悉，主要作用是在多线程并发时，保证线程访问共享数据时的线程安全。
它的作用有三点：

确保线程互斥的访问同步代码
保证共享为师的修改及时可见
有效解决指令重排（synchronized同步中的代码，JVM不会轻易优化重排序）

Synchronized使用
它的用法主要是从两个维度上来区分：

根据修饰对象的分类

修...]]></description><category></category></item><item><title><![CDATA[重学Android——Binder运行机制]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/91355634</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/91355634</guid><author>ApkCore</author><pubDate>Sun, 09 Jun 2019 18:36:04 +0800</pubDate><description><![CDATA[Binder
昨天从源码角度看了Android9.0下Activity的启动流程，其中关于跨进程的调用，都使用到了Binder进行跨进程通信，那么今天来阅读下Android的FrameWork层怎么实现Binder的吧。
IPC
IPC是Inter Process Communication的缩写，意思是进程间通信。在Android系统中，每个应用都运行在一条独立的进程上，具有自己的DVM实例，而...]]></description><category></category></item><item><title><![CDATA[重学Android——基于Android9.0的Activity启动流程]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/91349317</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/91349317</guid><author>ApkCore</author><pubDate>Sun, 09 Jun 2019 00:53:08 +0800</pubDate><description><![CDATA[Activity系统的启动
首先总结了解一下Android系统的启动：

启动电源以及系统启动
引导程序BootLoader——BootLoader是android操作系统开始运行前的一个小程序，它的主要功能就是把系统os拉起来并运行
Linux内核启动——在内核启动后，会在系统文件中找到init.rc文件，并启动init进程
init进程启动——初始化和启动属性服务，并启动zygote进程
Zy...]]></description><category></category></item><item><title><![CDATA[重学Java——ThreadLocal源码解读]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/91175539</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/91175539</guid><author>ApkCore</author><pubDate>Fri, 07 Jun 2019 23:26:01 +0800</pubDate><description><![CDATA[ThreadLocal
今天端午，就看一下轻松点的东西吧，上次说消息机制，说到Looper时，就是把Looper存储在ThreadLocal中，然后在对应的线程获取到对象，今天就来看下ThreadLocal的源码解读吧。
ThreadLocal的简单使用
还是上次讲的那个例子
    final ThreadLocal&lt;Integer&gt; threadLocal = new Thread...]]></description><category></category></item><item><title><![CDATA[重学Android——View的事件分发]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/91070791</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/91070791</guid><author>ApkCore</author><pubDate>Fri, 07 Jun 2019 01:04:28 +0800</pubDate><description><![CDATA[本文源码Api28

View的事件分发
我们都知道，点击事件最重要的三个方法
//用来进行事件分发
public boolean dispatchTouchEvent(MotionEvent ev);
//判断是否拦截某个事件
public boolean onInterceptTouchEvent(MotionEvent ev);
//处理touch事件
public boolean onT...]]></description><category></category></item><item><title><![CDATA[重学Android——消息机制]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/90982881</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/90982881</guid><author>ApkCore</author><pubDate>Thu, 06 Jun 2019 00:22:47 +0800</pubDate><description><![CDATA[Android消息机制

本文源码Api28

在Android在主线程的创建时，会自动创建一个looper，不需要我们自己来创建。
那么Android应用启动流程中，会由AMS调用的ActivityThread类，它的main入口方法里：
public static void main(String[] args) {
        ...

        Looper.prepareMai...]]></description><category></category></item><item><title><![CDATA[匹配字符串之——KMP算法深入理解]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/84311896</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/84311896</guid><author>ApkCore</author><pubDate>Tue, 20 Nov 2018 23:44:35 +0800</pubDate><description><![CDATA[KMP算法的用途
一般在字符串匹配的时候，我们通常想到的就是使用KMP算法来处理。
KMP的使用，在网上有很多实例，但是讲得很让人容易接受的不是很多，但总感觉那层窗户纸没有捅破，这里我结合前人的知识，讲下自己的理解，希望大家多指教。
常规暴力匹配法
有一个字符串&amp;quot;BBC ABCDAB ABCDABCDABDE&amp;quot;，我想知道，里面是否包含另一个字符串&amp;quot;ABCDABD&amp;quot;？
预处理时间 O(0)
时间复杂...]]></description><category></category></item><item><title><![CDATA[打造兼容的Android揭面水波动画库]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/71172360</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/71172360</guid><author>ApkCore</author><pubDate>Thu, 04 May 2017 17:01:40 +0800</pubDate><description><![CDATA[今天看到了@[Anderson大码渣](http://www.jianshu.com/u/016a5ba708a0)写的文章，对5.0以上默认使用ViewAnimationUtils.createCircularReveal(view, centerX, centerY, startRadius, endRadius);来实现渐变， 
，写得非常好，这一块的封装就跳过了，可以直接看他的原文。4.0以]]></description><category></category></item><item><title><![CDATA[Messenger轻量级IPC方案]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/69054450</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/69054450</guid><author>ApkCore</author><pubDate>Tue, 04 Apr 2017 00:17:09 +0800</pubDate><description><![CDATA[概述什么是messengerMessenger可以翻译为信使，通过它可以在不同的进程中传递Messenger对象，在Message中放入我们要传递的数据，可以轻松实现数据的跨进程传递。Messenger是一种轻量级的IPC方案，底层实现了AIDL。什么是基于消息的进程间通信如下图所示 可以看到，我们可以在客户端发送一个Message给服务端，服务端在handler中会接收到客户端的消息，然后进行对应]]></description><category></category></item><item><title><![CDATA[Android高级UI_双缓冲策略解决GPU卡顿]]></title><link>https://blog.youkuaiyun.com/ApkCore/article/details/66971764</link><guid>https://blog.youkuaiyun.com/ApkCore/article/details/66971764</guid><author>ApkCore</author><pubDate>Mon, 27 Mar 2017 15:01:22 +0800</pubDate><description><![CDATA[在上一篇中有讲到绘制一个水波纹效果，当打开此界面过久时，会有明显的卡顿，查看内存很稳定， 
这时候我们先打开开发者选项里的”GPU呈现模式分析“，设置为“在屏幕上显示为条形图”（不同的手机可能有略微的差异，我这里用的是小米）。 
 
可以看到，当重复绘制时，GPU的负荷太高，卡顿也就再所难免。如何解决当我们只绘制一段水波纹不使用canvas.clipPath(mPath, Region.Op.INT]]></description><category></category></item></channel></rss>