<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[jamespengo的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/java_pengjin</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; java_pengjin]]></copyright><item><title><![CDATA[Glide缓存原理]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/102844216</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/102844216</guid><author>java_pengjin</author><pubDate>Thu, 31 Oct 2019 19:36:06 +0800</pubDate><description><![CDATA[Glide使用了DiskCache+MemoryCache+activeResources三级缓存
DiskCache是磁盘缓存，这个不用多说了
MemoryCache和activeResources是两级内存缓存
MemoryCache存储当前没有使用到的Bitmap，当MemoryCache中命中Bitmap后，该Bitmap又被缓存至activeResources中，并从MemoryCach...]]></description><category></category></item><item><title><![CDATA[移动平台游戏网络优化方案]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/102844105</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/102844105</guid><author>java_pengjin</author><pubDate>Thu, 31 Oct 2019 19:32:06 +0800</pubDate><description><![CDATA[目标

对程序的包量和通信进行优化，从根本上减缓网络压力
在出现网络异常的时候，保证玩家能快速重新连接到服务器并继续游戏，并且体验良好

重连条件

NetworkException，Timeout 在这种显式抛出异常的情况下，就说明网络已经无法顺利的和服务器进行连接，在这些消息类型中客户端这边就会触发断线重连流程
但实际情况中，还有可能发生客户端网络并未断开，也并没有异常抛出，但是却出现客户端和...]]></description><category></category></item><item><title><![CDATA[Android App及Activity回收流程分析]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/98851382</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/98851382</guid><author>java_pengjin</author><pubDate>Thu, 08 Aug 2019 11:08:39 +0800</pubDate><description><![CDATA[首先我们要找到整个内存不足然后回调回收activity的入口，在哪里呢？在ActivityThread里，通过之前的源码阅读我们发现，当一个新的app启动的时候，系统将从Zygote进程fork一个子进程出来，当然我们知道App不一定只存在一个进程，只要定义了Activity进程要游离，我们也可以将其游离，但本质上都是由核心Android 进程 Zygote 进程去启动，但app进程启动之后，A...]]></description><category></category></item><item><title><![CDATA[Window窗口机制——WindowManager，ViewRootImpl，View理解]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/98624669</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/98624669</guid><author>java_pengjin</author><pubDate>Tue, 06 Aug 2019 15:50:10 +0800</pubDate><description><![CDATA[在之前的文章中我们说到DecorView在handleResumeActivity方法中被绑定到了WindowManager，也就是调用了windowManager.addView(decorView)。而WindowManager的实现类是WindowManagerImpl，而它则是通过WindowManagerGlobal代理实现addView的，我们来看一下addView()方法
publi...]]></description><category></category></item><item><title><![CDATA[Android GLSurfaceView模糊效果]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/95196282</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/95196282</guid><author>java_pengjin</author><pubDate>Tue, 09 Jul 2019 15:03:25 +0800</pubDate><description><![CDATA[import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.opengl.GLException;
import android.opengl.GLSurfaceView;
import android.suppor...]]></description><category></category></item><item><title><![CDATA[移动平台游戏网络重连方案]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/86741758</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/86741758</guid><author>java_pengjin</author><pubDate>Fri, 01 Feb 2019 15:34:31 +0800</pubDate><description><![CDATA[1、背景
　　移动网络信号波动频繁，给移动游戏开发者带来诸多困扰，处理不好会造成较差的用户体验以及重复扣道具等严重问题。因此弱网络问题在TDR技术评审中作为客户端重点挑战项，并且弱网络专项测试达标后方能上线。本文就过往项目中遇到的问题给出一种比较通用解决方案。
　　2、网络连接方式
　　通常游戏客户端都是通过创建socket与服务器取得连接，但也会根据使用场景划分成两种连接方式：TCP连接和HTT...]]></description><category></category></item><item><title><![CDATA[LeakCanary原理分析]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/86611540</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/86611540</guid><author>java_pengjin</author><pubDate>Wed, 23 Jan 2019 15:38:55 +0800</pubDate><description><![CDATA[很久没有写博客了，最近年关将近，也有时间去回顾和温习一下之前的技术笔记，突然发现了之写的一篇，温故了一遍，感觉没有描述清楚，于是去网上又查了一下，千篇一律的都是这么几个步骤：
1.通过Application.registerActivityLifecycleCallbacks()方法注册Activity生命周期，在onDestroy的时候进行watch
2.将Activity通过弱引用KeyedW...]]></description><category></category></item><item><title><![CDATA[Netty 粘包、半包解决]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/83097100</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/83097100</guid><author>java_pengjin</author><pubDate>Tue, 16 Oct 2018 20:38:40 +0800</pubDate><description><![CDATA[Netty和Mina一样是NIO通讯工具框架，有一定区别也有一定相似之处。Netty和Mina在数据包处理、传输时都有可能会出现粘包和断包的情况，下图对粘包、断包进行描述。

以下是网上对粘包的解决方式：
1、消息定长，例如每个报文的大小为固定长度200字节，如果不够，空位补空格。
2、在包尾增加回车换行符进行分割，例如FTP协议。
3、将消息分为消息头和消息体，消息头中包含消息长度的字段，通常设...]]></description><category></category></item><item><title><![CDATA[基于Netty的Android长连接实现]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/81463084</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/81463084</guid><author>java_pengjin</author><pubDate>Mon, 06 Aug 2018 23:03:26 +0800</pubDate><description><![CDATA[1. 协议的确定


协议头——4字节，标识协议体的长度
协议体——包括4字节扩展信息+传参，其中扩展信息里包括协议加密类型，传参为key，value键值对类型的数据，数据格式为4字节key长度+key+4字节value长度+value




2.协议加解密


客户端随机生成16位密钥，通过RSA非对称加密方式将密钥同步给服务器
密钥同步后，使用该密钥通过AES对称加密的方式对协议进行加密，然...]]></description><category></category></item><item><title><![CDATA[JAVA LinkedBlockingQueue阻塞队列]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/79791337</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/79791337</guid><author>java_pengjin</author><pubDate>Mon, 02 Apr 2018 16:35:30 +0800</pubDate><description><![CDATA[在Java多线程应用中，队列的使用率很高，多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列，其中阻塞队列的典型例子是BlockingQueue，非阻塞队列的典型例子是ConcurrentLinkedQueue，在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。 
注：什么叫线程安全？这个首先要明确。线程安全就是说多线程访问同一代码，不会产生...]]></description><category></category></item><item><title><![CDATA[JAVA动态代理（JDK和cglib）]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/79771393</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/79771393</guid><author>java_pengjin</author><pubDate>Sat, 31 Mar 2018 17:32:54 +0800</pubDate><description><![CDATA[JAVA的动态代理（被代理类必须实现了接口） 代理模式 代理模式是常用的java设计模式，他的特征是代理类与委托类有同样的接口，代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类，以及事后处理消息等。代理类与委托类之间通常会存在关联关系，一个代理类的对象与一个委托类的对象关联，代理类的对象本身并不真正实现服务，而是通过调用委托类的对象的相关方法，来提供特定的服务。 按照代理的创建时期，...]]></description><category></category></item><item><title><![CDATA[JAVA线程的interrupt]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/79771384</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/79771384</guid><author>java_pengjin</author><pubDate>Sat, 31 Mar 2018 17:32:25 +0800</pubDate><description><![CDATA[interrupt()只是改变中断状态而已. interrupt()不会中断一个正在运行的线程。这一方法实际上完成的是，给受阻塞的线程抛出一个中断信号，    这样受阻线程就得以退出阻塞的状态。更确切 的说，如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞，    那么，它将接收到一个中断异常（InterruptedException），从而提早...]]></description><category></category></item><item><title><![CDATA[JAVA正确地停止一个线程]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/79771380</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/79771380</guid><author>java_pengjin</author><pubDate>Sat, 31 Mar 2018 17:32:01 +0800</pubDate><description><![CDATA[如何正确停止线程关于如何正确停止线程，这篇文章(how to stop thread)给出了一个很好的答案, 总结起来就下面3点（在停止线程时）：1. 使用violate boolean变量来标识线程是否停止2. 停止线程时，需要调用停止线程的interrupt()方法，因为线程有可能在wait()或sleep(), 提高停止线程的即时性3. 对于blocking IO的处理，尽量使用Interr...]]></description><category></category></item><item><title><![CDATA[为什么线程协作之前必须先获得锁?]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/79771375</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/79771375</guid><author>java_pengjin</author><pubDate>Sat, 31 Mar 2018 17:31:32 +0800</pubDate><description><![CDATA[为什么Object.wait()/notify()/notifyAll() 之前必须获得锁？ 这是JLS的规定。Wait-notify机制是围绕监控器锁进行的，获得锁是很自然的前提，自身没有拿到锁之前，怎么能够尝试去操作靠锁来调控的线程呢？不过今天偶尔有时间，就看下Sun Hotspot是怎么实现这一机制的。当我们执行下面的代码时，线程会抛出异常java.lang.IllegalMonitorSt...]]></description><category></category></item><item><title><![CDATA[JAVA NIO 之Channel]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/79771345</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/79771345</guid><author>java_pengjin</author><pubDate>Sat, 31 Mar 2018 17:29:11 +0800</pubDate><description><![CDATA[Channel接口提供缓冲区与实体文件或套接字连接的一个抽象——通道，用于字节缓冲区和位于通道另一侧（通常是一个文件或套接字）之间有效地传输数据。多数情况下，通道与操作系统的文件描述符（File Descriptor）和文件句柄（File Handler）有着一对一的关系。虽然通道比文件描述符更广义，但我们经常使用到的多数通道都是连接到文件描述符的。1.通道基础Channel接口继承关系下面是ch...]]></description><category></category></item><item><title><![CDATA[JAVA AIO]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/79771339</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/79771339</guid><author>java_pengjin</author><pubDate>Sat, 31 Mar 2018 17:27:53 +0800</pubDate><description><![CDATA[转载Reactor and Proactor的内容系统I/O 可分为阻塞型, 非阻塞同步型以及非阻塞异步型[1, 2]. 阻塞型I/O意味着控制权只到调用操作结束了才会回到调用者手里. 结果调用者被阻塞了, 这段时间了做不了任何其它事情. 更郁闷的是,在等待IO结果的时间里,调用者所在线程此时无法腾出手来去响应其它的请求，这真是太浪费资源了。拿read()操作来说吧, 调用此函数的代码会一直僵在此...]]></description><category></category></item><item><title><![CDATA[java io以及unix io模型]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/79771321</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/79771321</guid><author>java_pengjin</author><pubDate>Sat, 31 Mar 2018 17:26:53 +0800</pubDate><description><![CDATA[这部分的东西在网络编程经常能看到，不过在所有IO处理中都是类似的。IO请求的两个阶段：       等待资源阶段：IO请求一般需要请求特殊的资源（如磁盘、RAM、文件），当资源被上一个使用者使用没有被释放时，IO请求就会被阻塞，直到能够使用这个资源。       使用资源阶段：真正进行数据接收和发生。       举例说就是排队和服务。 在等待资源阶段，IO分为阻塞IO和非阻塞IO。       ...]]></description><category></category></item><item><title><![CDATA[I/O基本概念]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/79771292</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/79771292</guid><author>java_pengjin</author><pubDate>Sat, 31 Mar 2018 17:25:45 +0800</pubDate><description><![CDATA[IO相关的内容包含：1.缓冲区操作2.内核空间与用户空间3.虚拟内存4.分页技术5.面向文件的IO和流IO6.多工IO（就绪性选择——IO多路复用）1. 缓冲区进程执行io操作，归结起来，也就是向操作系统发出请求，让它要么把缓冲区里的数据排干，要么用数据把缓冲区填满。进程使用这一机制处理所有数据的操作。io操作过程：用户进程使用read()系统调用，要求其缓冲区被填满，内核即向磁盘控制硬件发出命令...]]></description><category></category></item><item><title><![CDATA[文件系统中的逻辑块、物理块和扇区之间的关系]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/79771272</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/79771272</guid><author>java_pengjin</author><pubDate>Sat, 31 Mar 2018 17:23:42 +0800</pubDate><description><![CDATA[扇区（sector）:硬件（磁盘）上的最小的操作单位,是操作系统和块设备（硬件、磁盘）之间传送数据的单位。          block由一个或多个sector组成，文件系统中最小的操作单位；OS的虚拟文件系统从硬件设备上读取一个block，实际为从硬件设备读取一个或多个sector。对于文件管理来说，每个文件对应的多个block可能是不连续的;block最终要映射到sector上，所以block...]]></description><category></category></item><item><title><![CDATA[基于栈和基于寄存器的虚拟机]]></title><link>https://blog.youkuaiyun.com/java_pengjin/article/details/79231994</link><guid>https://blog.youkuaiyun.com/java_pengjin/article/details/79231994</guid><author>java_pengjin</author><pubDate>Thu, 01 Feb 2018 18:35:04 +0800</pubDate><description><![CDATA[1、解析器与解释器 

解析器是parser，而解释器是interpreter。两者不是同一样东西，不应该混用。 

前者是编译器/解释器的重要组成部分，也可以用在IDE之类的地方；其主要作用是进行语法分析，提取出句子的结构。广义来说输入一般是程序的源码，输出一般是语法树（syntax
 tree，也叫parse tree等）或抽象语法树（abstract
 syntax tree，A]]></description><category></category></item></channel></rss>