<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[itheimach的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/itheimach</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; itheimach]]></copyright><item><title><![CDATA[访问者设计模式]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/95956232</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/95956232</guid><author>itheimach</author><pubDate>Mon, 15 Jul 2019 13:29:35 +0800</pubDate><description><![CDATA[访问者设计模式：
##被访问者：
有一些稳定的结构对象，提供accept方法供访问者进行访问
##访问者：
一些访问者，有一个visitor方法实现对对象的访问，不同的对象会做出不同的反应！
##应用
公司年终奖考核：
被访问者有：程序员，产品经理（accept(Visitor)）
访问者：CEO，CTO(visit(…))
CEO可能只会关注KPI，CTO可能只会关注程序员的KPI+代码量，产品...]]></description><category></category></item><item><title><![CDATA[Cmake杂记]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/94836646</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/94836646</guid><author>itheimach</author><pubDate>Sat, 06 Jul 2019 10:24:44 +0800</pubDate><description><![CDATA[解决什么问题：
很多make工具有不同饭标准和规范，不支持跨平台，如果想跨平台就的为每个平台都写一份makefile,cmake就是用来可以跨平台的编译工具
使用步骤：
1.编写Cmakelist.txt
2.执行make PATH生成Makefile
3.使用make命令进行编译
安装：
编译源码
下载二进制文件
命令行操作需要：
CMAKE常用语法：
//指定最小支持的Cmake版本
cmak...]]></description><category></category></item><item><title><![CDATA[OpenGL ES绘制流程理解]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/90815547</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/90815547</guid><author>itheimach</author><pubDate>Tue, 04 Jun 2019 23:55:20 +0800</pubDate><description><![CDATA[OpenGL ES绘制流程理解


]]></description><category></category></item><item><title><![CDATA[IM自定义消息协议安全--密钥协商过程]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/80648393</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/80648393</guid><author>itheimach</author><pubDate>Mon, 11 Jun 2018 10:29:26 +0800</pubDate><description><![CDATA[秘钥协商流程

IM消息自定义消息体设计时要考虑到可能产生的安全问题，如果消息体没有进行加密措施，很容易被抓包截取，消息加密要考虑到各个流程的可能出现的安全性问题！ 
下面是IM消息加密设计的密钥协商过程：

                  C                           S
(public key)P1,K1(AES) p1(k1)---&amp;gt; (private k...]]></description><category></category></item><item><title><![CDATA[SparseArray实现原理]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/80610803</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/80610803</guid><author>itheimach</author><pubDate>Thu, 07 Jun 2018 16:03:57 +0800</pubDate><description><![CDATA[SparseArray

SparseArray原理： 
SparseArray采用两个数组,用来存放key以及value值的，核心思想是通过折半查找来找到key对应的位置，然后取出值，或者插入值！



二分查找

static int binarySearch(int[] array, int size, int value) {
    int lo = 0;
    int hi = si...]]></description><category></category></item><item><title><![CDATA[YV12,YU12,NV12,NV21,YVU420,I420,YUV420P,YUV420SP]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/80399262</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/80399262</guid><author>itheimach</author><pubDate>Mon, 21 May 2018 22:41:53 +0800</pubDate><description><![CDATA[最近在做手机相机视频采集，需要采集视频数据然后转换成相应的格式进行传输，对一些存储格式做了一些了解，总结如下：



WHY YUV

    RGB类似，YUV也是一种颜色编码方法，主要用于电视系统以及模拟视频领域，它将亮度信息（Y）与色彩信息（UV）分离，没有UV信息一样可以显示完整的图像，只不过是黑白的，这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且，YUV不像RGB那样要求三个...]]></description><category></category></item><item><title><![CDATA[SQL 高级语法]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/80184193</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/80184193</guid><author>itheimach</author><pubDate>Thu, 03 May 2018 18:12:22 +0800</pubDate><description><![CDATA[复制表数据

复制表结构以及数据：
    create table new as select * from old
复制数据到一个相同的表：
    insert into sametable select * from old
只复制表结构：
    create table new as select * from old where 1 = 2   




树形结构表查询



查询某...]]></description><category></category></item><item><title><![CDATA[SQL 常用操作]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/80182418</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/80182418</guid><author>itheimach</author><pubDate>Thu, 03 May 2018 16:43:52 +0800</pubDate><description><![CDATA[SQL语句



关键字



DISTINCT

用来返回唯一不同的列    select distinct name from student;



where

有条件的选取数据，对于文本值，使用单引号，数值不用引号！  

select * from person where age=20    select * from person where name='jonh'




ins...]]></description><category></category></item><item><title><![CDATA[leetcode 二叉树遍历]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/79714748</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/79714748</guid><author>itheimach</author><pubDate>Tue, 27 Mar 2018 16:10:52 +0800</pubDate><description><![CDATA[二叉树遍历

二叉树遍历：前序，中序，后序遍历，层序遍历，可以用递归或者队列，栈来实现！



层序遍历

/**
 * 102. Binary Tree Level Order Traversal
 * 利用队列实现层序遍历二叉树
 * 思路：
 * 1.将根节点入队列
 * 2.如果队列非空，执行以下步骤：
 *   a.出队列取得队列的节点，访问该节点
 *   b.如果左子树非空，将左子树...]]></description><category></category></item><item><title><![CDATA[leetcode 二叉树相关]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/79714331</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/79714331</guid><author>itheimach</author><pubDate>Tue, 27 Mar 2018 15:50:43 +0800</pubDate><description><![CDATA[求根节点到叶节点的数字之和

/**
 * 129. Sum Root to Leaf Numbers
 * 求根节点到叶节点的数字之和
 * 递归出口，叶节点
 * @param root
 * @return
 */
public int sumNumbers(TreeNode root) {

    return  sumTree(root,0);
}

public int sumTre...]]></description><category></category></item><item><title><![CDATA[leetcode 二分搜索树]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/79710903</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/79710903</guid><author>itheimach</author><pubDate>Tue, 27 Mar 2018 11:48:55 +0800</pubDate><description><![CDATA[二分搜索树

二分搜索树势一颗典型的二叉树，二分搜索树根节点的值大于左孩子节点的值，小于右孩子节点的值，插入／删除／查找的时间复杂度都是log(n)



二叉搜索树的创建，插入，删除



创建，插入

 /**
 * 思路：
 * 首先初始化第一个节点，然后第二个节点要插入树中需要找到要插入位置的根节点，
 * 有一个查找的过程，然后根据值的大小分别放在左右子树
 * @param a
 * ...]]></description><category></category></item><item><title><![CDATA[状态模式／Android状态机／微信多人语音]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/79599391</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/79599391</guid><author>itheimach</author><pubDate>Sun, 18 Mar 2018 12:04:03 +0800</pubDate><description><![CDATA[最近在做类似微信多人语音，视频聊天功能，用到了Android的状态机，借此写写自己的理解

状态模式

对状态模式的理解：

不同的状态对应不同的行为，当一个对象的状态改变了，那么该对象的行为也随之改变！通过将状态封装成一个类，然后去控制对象的行为，这就是状态模式！


解决什么问题：

一个事物有很多种状态，如果不使用状态模式，那么在执行具体的操作的时候，就会有很多的if/else 或者swit...]]></description><category></category></item><item><title><![CDATA[图片显示不完整]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/79068366</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/79068366</guid><author>itheimach</author><pubDate>Mon, 15 Jan 2018 20:24:45 +0800</pubDate><description><![CDATA[记录一个bug

最近遇到一个非常难搞的问题，花了蛮长的时间才算解决了，这里记录一下自己的解决过程！



图片显示一半

我们的APP里面偶尔出现图片只加载了一部分的问题，但是其他用户显示是正常的，也不算必现，就是偶尔听用户报一下，之前也没有太过关注这个bug了，没有及时去处理，作为了一个遗留问题，延后解决！ 
随着时间的流逝，突然一个大boss直接将这个bug反馈到我们研发，而且还是比较重要的]]></description><category></category></item><item><title><![CDATA[Glide使用及踩坑日记]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/79056345</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/79056345</guid><author>itheimach</author><pubDate>Sun, 14 Jan 2018 14:05:59 +0800</pubDate><description><![CDATA[Glide使用及踩坑日记



背景

项目中使用的是之前的ImageLoader，这个图片加载库很久没有维护了，决定使用Glide替换掉ImageLoader



使用Glide



Glide的优点

1.Glide的API使用非常的方便，支持链式调用，支持各种形式源的图片
2.默认使用RGB-565，内存使用更小，滑动更加平滑
3. Glide支持和Glide的生命周期同步
4.可以支持]]></description><category></category></item><item><title><![CDATA[JNI DETECTED ERROR IN APPLICATION: java_object == null]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/78952304</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/78952304</guid><author>itheimach</author><pubDate>Tue, 02 Jan 2018 15:29:31 +0800</pubDate><description><![CDATA[记录一个问题，在调用一个j ni方法的时候报了一个错误，错误日志如下：01-02 10:29:26.288 20617-20617/? A/art: art/runtime/java_vm_ext.cc:470] JNI DETECTED ERROR IN APPLICATION: java_object == null
01-02 10:29:26.288 20617-20617/? A/art:]]></description><category></category></item><item><title><![CDATA[LRUCache源码解析]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/78948416</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/78948416</guid><author>itheimach</author><pubDate>Tue, 02 Jan 2018 01:04:01 +0800</pubDate><description><![CDATA[LruCache源码解析LruCache通常用来做图片缓存，通过LRU算法来缓存图片，我们来看源码是怎么实现！构造方法public LruCache(int maxSize) {
    if (maxSize <= 0) {
        throw new IllegalArgumentException("maxSize <= 0");
    }
    this.maxSize = ma]]></description><category></category></item><item><title><![CDATA[微信的bug]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/78948141</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/78948141</guid><author>itheimach</author><pubDate>Mon, 01 Jan 2018 23:18:20 +0800</pubDate><description><![CDATA[记录一个微信的bug（请允许我说一段废话）Android是基于Linux的一个开放，开源的系统，使得成千上万的开发者投入其中，开源的一个弊端就是开发商对Android系统做了各种各样的定制，对我们开发者来说，有可能导致相同的代码在不同版本，不同厂商的手机表现形式不一样，需要对具体机型做适配！（正文开始）最近在做语音通话模块，需要在手机锁屏情况下收到通话信令，弹起通话界面，覆盖锁屏显示只需要添加几个属]]></description><category></category></item><item><title><![CDATA[AsyncTask源码解析]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/78735938</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/78735938</guid><author>itheimach</author><pubDate>Wed, 06 Dec 2017 22:19:53 +0800</pubDate><description><![CDATA[AsyncTask的使用AsyncTask是一个轻量级的异步线程类，主要用于异步加载数据并同时更新UI的操作，非常方便，使用也非常简单：“` 
        @Override 
        protected void onPreExecute() { 
            super.onPreExecute(); 
        }    @Override
    protect]]></description><category></category></item><item><title><![CDATA[String to Integer (atoi)]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/78556500</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/78556500</guid><author>itheimach</author><pubDate>Thu, 16 Nov 2017 23:16:16 +0800</pubDate><description><![CDATA[class Solution { 
    public int myAtoi(String str) {       if (str == null) {
            return 0;
        }        str = str.trim();
        if ("".equals(str)) {            return 0;
        }]]></description><category></category></item><item><title><![CDATA[Reverse Integer]]></title><link>https://blog.youkuaiyun.com/itheimach/article/details/78547066</link><guid>https://blog.youkuaiyun.com/itheimach/article/details/78547066</guid><author>itheimach</author><pubDate>Thu, 16 Nov 2017 09:08:04 +0800</pubDate><description><![CDATA[/** 
         * 将整数倒转 
         * 思路： 
         * 1.将该数依次%10，并将结果保存起来，将改数/10 
         * 2.判断溢出问题 
         * @param x 
         * @return 
         */ 
       public static int reverse1(int x) {]]></description><category></category></item></channel></rss>