<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[zy_lip的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/zy_lip</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zy_lip]]></copyright><item><title><![CDATA[okHttp]]></title><link>https://blog.youkuaiyun.com/zy_lip/article/details/143974888</link><guid>https://blog.youkuaiyun.com/zy_lip/article/details/143974888</guid><author>zy_lip</author><pubDate>Fri, 22 Nov 2024 15:48:28 +0800</pubDate><description><![CDATA[责任链调用图可以分析出来，假如一个请求在 RetryAndFollowUpInterceptor 这个拦截器内部重试或者重定向了 N 次，那么其内部嵌套的所有拦截器也会被调用N次，同样 networkInterceptors 自定义的拦截器也会被调用 N 次。1.在http 1.x协议下，所有的请求的都是顺序的，正在写入数据的socket无法被另一个请求复用 2.http2.0协议使用了多路复用技术，允许同一个socket在同一个时候写入多个流数据。]]></description><category></category></item><item><title><![CDATA[Activity启动流程]]></title><link>https://blog.youkuaiyun.com/zy_lip/article/details/143966073</link><guid>https://blog.youkuaiyun.com/zy_lip/article/details/143966073</guid><author>zy_lip</author><pubDate>Fri, 22 Nov 2024 11:25:02 +0800</pubDate><description><![CDATA[类并实现相应的方法，这样Launcher进程作为客户端就拥有了服务端AMS的代理对象，然后就可以调用AMS的方法来实现具体功能了。代理对象，此时如果要实现客户端与服务端进程间的通信， 需要。进程在收到请求后，进行一系列准备工作后，再通过。就可以通过这个代理对象 来控制应用进程。对象，并开启主线程消息循环。后，通过发射机制创建目标。应用进程，实际上执行的。进程作为客户端与服务端。）在收到请求后，通过。便正式启动，开始进入。渲染结束后便可以看到。]]></description><category></category></item><item><title><![CDATA[java-序列化]]></title><link>https://blog.youkuaiyun.com/zy_lip/article/details/143858668</link><guid>https://blog.youkuaiyun.com/zy_lip/article/details/143858668</guid><author>zy_lip</author><pubDate>Mon, 18 Nov 2024 15:34:32 +0800</pubDate><description><![CDATA[Java序列化是指把Java对象转换为字节序列的过程Java反序列化是指把字节序列恢复为Java对象的过程序列化是将对象的状态信息转换为可存储或传输的形式的过程。我们都知道，Java对象是保存在JVM的堆内存中的，也就是说，如果JVM堆不存在了，那么对象也就跟着消失了。而序列化提供了一种方案，可以让你在即使JVM停机的情况下也能把对象保存下来的方案。就像我们平时用的U盘一样。把Java对象序列化成可存储或传输的形式（如二进制流），比如保存在文件中。]]></description><category></category></item><item><title><![CDATA[View事件分发]]></title><link>https://blog.youkuaiyun.com/zy_lip/article/details/143854572</link><guid>https://blog.youkuaiyun.com/zy_lip/article/details/143854572</guid><author>zy_lip</author><pubDate>Mon, 18 Nov 2024 15:31:42 +0800</pubDate><description><![CDATA[①Activity：只有分发dispatchTouchEvent、消费onTouchEvent两个方法。事件由ViewRootImpl中DecorView dispatchTouchEvent分发Touch事件->Activity的dispatchTouchEvent()->DecorView的superDispatchTouchEvent-> ViewGroup的dispatchTouchEvent()。]]></description><category></category></item><item><title><![CDATA[SurfaceView]]></title><link>https://blog.youkuaiyun.com/zy_lip/article/details/143798925</link><guid>https://blog.youkuaiyun.com/zy_lip/article/details/143798925</guid><author>zy_lip</author><pubDate>Fri, 15 Nov 2024 18:33:21 +0800</pubDate><description><![CDATA[SurfaceView是View的子类，实现了Parcelable接口，其中内嵌了一个专门用于绘制的Surface，SurfaceView可以控制这个Surface的格式和尺寸，以及Surface的绘制位置。Surface可以理解为就是管理数据的地方，SurfaceView就是展示数据的地方。它使用机制，有自己的 surface，。SurfaceView虽然具有独立的绘图表面，不过它仍然是宿主窗口的视图结构中的一个结点，因此，它仍然是可以参与到宿主窗口的绘制流程中去的。]]></description><category></category></item><item><title><![CDATA[View绘制流程]]></title><link>https://blog.youkuaiyun.com/zy_lip/article/details/143776358</link><guid>https://blog.youkuaiyun.com/zy_lip/article/details/143776358</guid><author>zy_lip</author><pubDate>Fri, 15 Nov 2024 14:37:55 +0800</pubDate><description><![CDATA[ViewRootImpl.performTraversals流程：measure、layout、draw流程：Measure：①单一View：measure()getDefaultSize() 计算View的宽/高值setMeasuredDimension存储测量后的View宽/高measure()需要重写onMeasure，ViewGroup没有定义测量的具体过程，是一个抽象类，其测量过程的onMeasure方法需要各个子类去实现，遍历测量ViewGroup中所有的View。]]></description><category></category></item><item><title><![CDATA[Layout布局加载、绘制流程]]></title><link>https://blog.youkuaiyun.com/zy_lip/article/details/143761170</link><guid>https://blog.youkuaiyun.com/zy_lip/article/details/143761170</guid><author>zy_lip</author><pubDate>Thu, 14 Nov 2024 16:06:44 +0800</pubDate><description><![CDATA[该方法中，像TextView，ImageView等是通过new AppCompatXXX创建的，这是为了将一些控件变成兼容性控件（例如将 TextView 变成 AppCompatTextView）以便于向下兼容新版本中的效果，在高版本中的一些控件新特性可以在老版本中也能展示。3.createViewFromTag来创建View的实例，如果创建的是ViewGroup，则会对它的子View遍历重复创建步骤，创建完View对象后，会add到对应的ViewGroup中。]]></description><category></category></item><item><title><![CDATA[java-锁]]></title><link>https://blog.youkuaiyun.com/zy_lip/article/details/143732882</link><guid>https://blog.youkuaiyun.com/zy_lip/article/details/143732882</guid><author>zy_lip</author><pubDate>Wed, 13 Nov 2024 16:34:42 +0800</pubDate><description><![CDATA[描述为一种同步机制，它通常被描述为一个对象，所有的Java对象是天生的Monitor，每一个Java对象都有成为Monitor的潜质，当一个 monitor 被某个线程持有后，它便处于锁定状态。又名递归锁，是指在同一个线程在外层方法获取锁的时候，再进入该线程的内层方法会自动获取锁（前提锁对象得是同一个对象或者class），不会因为之前已经获取过还没释放而阻塞。synchronized是一种对象锁（锁的是对象而非引用变量），可以用来实现对临界资源的同步互斥访问 ，可重入锁。其可重入最大的作用是避免死锁。]]></description><category></category></item><item><title><![CDATA[RecyclerView缓存、复用]]></title><link>https://blog.youkuaiyun.com/zy_lip/article/details/143692357</link><guid>https://blog.youkuaiyun.com/zy_lip/article/details/143692357</guid><author>zy_lip</author><pubDate>Tue, 12 Nov 2024 13:31:36 +0800</pubDate><description><![CDATA[这里例子使用的是 GridLayoutManager，滑动时的回收逻辑则是在父类 LinearLayoutManager 里实现，回收第一行卡位时是从后往前回收，所以最新的两个卡位是0、1，会放在 mCachedViews 里，而2、3、4的卡位则放在 ViewPool 里。RecyclerView 共创建17个 ViewHolder，是因为在第四行的卡位要显示出来时，ViewPool 里只有3个缓存，而第四行的卡位又用不了 mCachedViews 里的2个缓存（，因此只有三个卡位需要重新绑定数据。]]></description><category></category></item><item><title><![CDATA[垃圾回收机制]]></title><link>https://blog.youkuaiyun.com/zy_lip/article/details/143684724</link><guid>https://blog.youkuaiyun.com/zy_lip/article/details/143684724</guid><author>zy_lip</author><pubDate>Mon, 11 Nov 2024 16:30:56 +0800</pubDate><description><![CDATA[而对象实例3、5之间虽然连通，但并没有任何一个GC Roots与之相连，这便是GC Roots不可达的对象，就是GC需要回收的垃圾对象。而如果在老年代中使用复制算法，在极端情况下，老年代对象的存活率可以达到100%，那么我们就需要复制这么多个对象到另外一个内存区域，这个工作量是非常庞大的。在GC时，将正在使用的内存中的存活对象复制到未使用的内存块中，之后清除正在使用的内存块中的所有对象，再交换两个内存块的角色，完成垃圾回收。：将所有存活的对象压缩在内存的一边，之后清理边界外的所有空间。]]></description><category></category></item></channel></rss>