<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[and_caicai的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/and_caicai</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; and_caicai]]></copyright><item><title><![CDATA[BuildApkPlugin 自动化编译打包]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/125434313</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/125434313</guid><author>and_caicai</author><pubDate>Thu, 23 Jun 2022 20:28:53 +0800</pubDate><description><![CDATA[Gradle插件，依赖进项目工程，编译APK，使用Task命令一键上传apk到三方平台，如：蒲公英。（目前暂时只支持蒲公英，可以进行扩展）。 上传成功后，如果你需要提醒其他人员进行版本更新，如：钉钉群、飞书群、企业微信群等（还可扩展其他），配置相关参数，自动发送更新消息到群里。............]]></description><category></category></item><item><title><![CDATA[Android kotlin之数据类和密封类(3)]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/106765606</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/106765606</guid><author>and_caicai</author><pubDate>Mon, 15 Jun 2020 17:30:12 +0800</pubDate><description><![CDATA[1.数据类

经常创建一些只保存数据的类。 在这些类中，一些标准函数往往是从数据机械推导而来的。在 Kotlin 中，这叫做数据类并标记为data：

data class Person(val name: String, val age: Int)

复制

在很多情况下，我们需要复制一个对象改变它的一些属性，但其余部分保持不变。copy()函数就是为此而生成。对于上文的User类，其实现会类似下面这样：


data class User(val name: String , val ag...]]></description><category></category></item><item><title><![CDATA[Android  kotlin之对象和类(2)]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/106689481</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/106689481</guid><author>and_caicai</author><pubDate>Thu, 11 Jun 2020 15:41:11 +0800</pubDate><description><![CDATA[类

Kotlin 中使用关键字class声明类

class Invoice { /*……*/ }

属性

Kotlin 类中的属性既可以用关键字var声明为可变的，也可以用关键字val声明为只读的。


class Address {
    var name: String = "Holmes, Sherlock"
    var street: String = "Baker"
    var city: String = "London"
    var state: Str...]]></description><category></category></item><item><title><![CDATA[Android的屏幕刷新原理]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/106648398</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/106648398</guid><author>and_caicai</author><pubDate>Tue, 09 Jun 2020 18:42:57 +0800</pubDate><description><![CDATA[Android的屏幕刷新中涉及到最重要的三个概念:

CPU：执行应用层的measure、layout、draw等操作，绘制完成后将数据提交给GPU

GPU：进一步处理数据，并将数据缓存起来

屏幕：由一个个像素点组成，以固定的频率（16.6ms，即1秒60帧）从缓冲区中取出数据来填充像素点

总结一句话就是：CPU 绘制后提交数据、GPU 进一步处理和缓存数据、最后屏幕从缓冲区中读取数据并显示





我们很容易想到一个问题，屏幕是以16.6ms的固定频率进行刷新的，但是我们应用层触发绘制的时机是完.]]></description><category></category></item><item><title><![CDATA[Android 之 AndroidX 库]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/106531234</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/106531234</guid><author>and_caicai</author><pubDate>Wed, 03 Jun 2020 19:34:48 +0800</pubDate><description><![CDATA[按照官方文档说明 AndroidX 是对 android.support.xxx 包的整理后产物。由于之前的 support 包过于混乱，所以，Google 推出了AndroidX。

由于在后续版本中，会逐步放弃对 support 的升级和维护，所以，我们必须迁移到 AndroidX。
...]]></description><category></category></item><item><title><![CDATA[Android Kotlin之数据类型（1）]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/106385558</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/106385558</guid><author>and_caicai</author><pubDate>Wed, 27 May 2020 18:58:17 +0800</pubDate><description><![CDATA[1.变量

Kotlin中有两个关键字定义变量 var 和 val

val是一个只读变量，这种声明变量的方式相当于java中的final变量。一个val创建的时候必须初始化，因为以后不能被改变。

var是一个可变变量，这是一个可以通过重新分配来更改为另一个值的变量。这种声明变量的方式和Java中声明变量的方式一样。

const关键字： const修饰的val变量相当于java中static final是真正意义上的java常量



2.常量 Byte Char ShortInt Dou...]]></description><category></category></item><item><title><![CDATA[Android之RxJava2]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/106340315</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/106340315</guid><author>and_caicai</author><pubDate>Mon, 25 May 2020 19:32:48 +0800</pubDate><description><![CDATA[RxJava 以观察者模式为骨架，在 2.0 中依旧如此。

不过此次更新中，出现了两种观察者模式：

Observable ( 被观察者 ) / Observer ( 观察者 )
	
	Flowable （被观察者）/ Subscriber （观察者）
	
1.被观察者 （小说），开始连载，读者订阅小说（subscribe），那么小说更新后 就会推送消息给读者。


       // 步骤1：创建被观察者 Observable &amp; 生产事件
//        // 即 连载小说，读者订阅小说，]]></description><category></category></item><item><title><![CDATA[JAVA之多线程并发详解]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/106264474</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/106264474</guid><author>and_caicai</author><pubDate>Thu, 21 May 2020 18:07:56 +0800</pubDate><description><![CDATA[线程和进程区别
	
  线程：

  1）进程中负责程序执行的执行单元

  2）依靠程序执行的顺序控制流，只能使用程序的资源和环境，共享进程的全部资源

  3）有自己的堆栈和局部变量，没有单独的地址空间

  4）CPU调度和分派的基本单位，持有程序计数器，寄存器，堆栈

 进程：

 1）系统资源分配和调度的独立单位

 2）至少包含一个线程

 3）拥有自己的资源


	线程的创建方式
	
源码：



1）.继承Thread类，实现run方法


     ...]]></description><category></category></item><item><title><![CDATA[JAVA 回收机制详解]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/106261739</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/106261739</guid><author>and_caicai</author><pubDate>Thu, 21 May 2020 17:26:02 +0800</pubDate><description><![CDATA[C的垃圾回收是人工的，工作量大，但是可控性高。
java是自动化的，但是可控性很差，甚至有时会出现内存溢出的情况，
内存溢出也就是jvm分配的内存中对象过多，超出了最大可分配内存的大小。

jvm会在什么时候进行回收

　1.会在cpu空闲的时候自动进行回收
　2.在堆内存存储满了之后
　3.主动调用System.gc()或者 Runtime.getRuntime().gc()后尝试进行回收。（ps:调用System.gc()或者 Runtime.getRuntime().gc()只是告诉虚拟机要回收，但.]]></description><category></category></item><item><title><![CDATA[Java双向队列Deque]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/106199581</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/106199581</guid><author>and_caicai</author><pubDate>Mon, 18 May 2020 19:27:44 +0800</pubDate><description><![CDATA[Deque的使用场景
在一般情况，不涉及到并发的情况下，有两个实现类，可根据其自身的特性进行选择，分别是：

LinkedList 大小可变的链表双端队列，允许元素为插入null。
	ArrayDeque 大下可变的数组双端队列，不允许插入null。
	ConcurrentLinkedDeque 大小可变且线程安全的链表双端队列，非阻塞，不允许插入null。
	LinkedBlockingDeque 为线程安全的双端队列，在队列为空的情况下，获取操作将会阻塞，直到有元素添加。

注意：LinkedList ]]></description><category></category></item><item><title><![CDATA[Android 屏幕适配的几种方法]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/106076616</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/106076616</guid><author>and_caicai</author><pubDate>Tue, 12 May 2020 15:40:50 +0800</pubDate><description><![CDATA[android中的dp在渲染前会将dp转为px，计算公式：


	px = density * dp;
	
	
	density = dpi / 160;
	
	
	px = dp * (dpi / 160)
	
而dpi是根据屏幕真实的分辨率和尺寸来计算的，每个设备都可能不一样的。



1.屏幕分辨率限定符适配

根据当前市面上手机的屏幕的分辨率创建不同的文件夹，系统运行的时候，会自动去选择读取对应的文件夹中的xml，即每种屏幕分辨率的设备需要定义一套 dimens.xml 文件



缺点是：假设我.]]></description><category></category></item><item><title><![CDATA[微信小程序（三），小程序的生命周期]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/106056055</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/106056055</guid><author>and_caicai</author><pubDate>Mon, 11 May 2020 15:59:59 +0800</pubDate><description><![CDATA[每个小程序都需要在app.js中调用App方法注册小程序实例，绑定生命周期回调函数、错误监听和页面不存在监听函数等。




            /** 生命周期回调—监听页面加载
             *
             * 页面加载时触发。一个页面只会调用一次，可以在 onLoad 的参数中获取打开当前页面路径            
            中的参数。
             */
         onLoad(
             /** 打开当...]]></description><category></category></item><item><title><![CDATA[微信小程序（二），sitemap 配置]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/106051191</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/106051191</guid><author>and_caicai</author><pubDate>Mon, 11 May 2020 14:26:02 +0800</pubDate><description><![CDATA[sitemap 配置

小程序根目录下的sitemap.json文件用来配置小程序及其页面是否允许被微信索引。

小程序根目录下的sitemap.json文件用于配置小程序及其页面是否允许被微信索引，文件内容为一个 JSON 对象，如果没有sitemap.json，则默认为所有页面都允许被索引


{
  "desc": "关于本文件的更多信息，请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.htm...]]></description><category></category></item><item><title><![CDATA[微信小程序开端（一），app.json全局配置]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/106021277</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/106021277</guid><author>and_caicai</author><pubDate>Sat, 09 May 2020 17:35:04 +0800</pubDate><description><![CDATA[微信小程序开发目录：


├── app.js
├── app.json
├── app.wxss
├── pages
│ │── index
│ │   ├── index.wxml
│ │   ├── index.js
│ │   ├── index.json
│ │   └── index.wxss
│ └── logs
│     ├── logs.wxml
│     └── logs.js
└── utils

一.小程序根目录下的app.json文件用来对微...]]></description><category></category></item><item><title><![CDATA[Android 开发日志之LBS相关开发]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/105836807</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/105836807</guid><author>and_caicai</author><pubDate>Wed, 29 Apr 2020 15:01:55 +0800</pubDate><description><![CDATA[根据公司业务需求的展开，需要接入地图，并且在地图上画轨迹曲线以及自定义画区域等等。地图api可以接入百度，高德，或者google。下面以项目接入的高德地图api为例；

高德开放平台文档：https://lbs.amap.com/api/webservice/guide/create-project/get-key；

按照项目具体需求下载相应的SDK,放入项目libs中；

（注意为了兼容...]]></description><category></category></item><item><title><![CDATA[Android 控件备用收集]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/105809381</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/105809381</guid><author>and_caicai</author><pubDate>Tue, 28 Apr 2020 11:31:48 +0800</pubDate><description><![CDATA[1.CardView卡片式布局

CardView适用于实现卡片式布局效果的重要控件，由appcompat-v7库提供，实际上CardView也是一个FrameLayout，只是额外提供了圆角和阴影效果，看上去有立体的感觉。一般CardView都用在ListView的item布局中。


  compile 'com.android.support:appcompat-v7:25.2.0'
  c...]]></description><category></category></item><item><title><![CDATA[android MVVM框架踩坑之旅]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/105786409</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/105786409</guid><author>and_caicai</author><pubDate>Mon, 27 Apr 2020 11:35:40 +0800</pubDate><description><![CDATA[1.Cause: couldn't make a guess for {Class Name}

错误分析:问题出在type引用对象 的包名中包含了大写

&lt;variable
      name="ss"
      type="cn.hand.myapplication.MyHandlers" /&gt;
解决方法:包路径都为小写

总结:代码书写要规范,...]]></description><category></category></item><item><title><![CDATA[热修复Tinker 集成bug]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/105726323</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/105726323</guid><author>and_caicai</author><pubDate>Fri, 24 Apr 2020 15:19:09 +0800</pubDate><description><![CDATA[1.Caused by: com.tencent.tinker.loader.TinkerRuntimeException: Tinker Exception:applicationLike must not be null.





2.

Error:java.lang.RuntimeException: Annotation processors must be explicitly ...]]></description><category></category></item><item><title><![CDATA[插件化BUG编译收集]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/105681260</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/105681260</guid><author>and_caicai</author><pubDate>Wed, 22 Apr 2020 17:52:40 +0800</pubDate><description><![CDATA[Error:FAILURE: Build failed with an exception.


* What went wrong:
Task '' not found in root project 'android-visualizer-master1'.


* Try:
Run gradle tasks to get a list of available tasks. Run with...]]></description><category></category></item><item><title><![CDATA[android apk包大小优化详解]]></title><link>https://blog.youkuaiyun.com/and_caicai/article/details/105508306</link><guid>https://blog.youkuaiyun.com/and_caicai/article/details/105508306</guid><author>and_caicai</author><pubDate>Tue, 14 Apr 2020 11:56:23 +0800</pubDate><description><![CDATA[1.使用开发工具 android studio

Build &gt; Analyz APK





2.文件说明

assets:存放一些配置文件res:资源文件，图片、字符串、xml等classes.dex:字节码文件resources.arsc:编译后的二进制资源文件META-INF:存放的是签名信息，用来保证apk包的完整性和系统的安全。
接下来就从res,classes.dex ...]]></description><category></category></item></channel></rss>