<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Lance_W]]></title><description><![CDATA[知其然，而后知其所以然]]></description><link>https://blog.youkuaiyun.com/wsq_tomato</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; wsq_tomato]]></copyright><item><title><![CDATA[Android Jetpack--LiveData篇]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/125660783</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/125660783</guid><author>wsq_tomato</author><pubDate>Sun, 10 Jul 2022 18:18:29 +0800</pubDate><description><![CDATA[本篇主要是Android Jetpack LiveData的原理解析和应用，并且通过源码的刨析，印证了LiveData在使用过程中出现的一些问题，有知道了LiveData怎么使用，想进一步了解LiveData是怎么实现数据的保存和观察的可以看看......]]></description><category></category></item><item><title><![CDATA[Jetpack App Startup——SDK自动初始化，告别Init]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/124324277</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/124324277</guid><author>wsq_tomato</author><pubDate>Thu, 21 Apr 2022 16:10:57 +0800</pubDate><description><![CDATA[还在调用XxxSDK.init吗？]]></description><category></category></item><item><title><![CDATA[Android jetpack navigation]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/122132841</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/122132841</guid><author>wsq_tomato</author><pubDate>Fri, 24 Dec 2021 17:39:30 +0800</pubDate><description><![CDATA[Navigation
版本导入：
ext.nav_version = "2.3.5"
implementation("androidx.navigation:navigation-fragment-ktx:$nav_version")
implementation("androidx.navigation:navigation-ui-ktx:$nav_version")

NavHost
navigation的宿主载体，即需要一个空的布局来承载fragment的切换。
navigation的宿主需要实现Na]]></description><category></category></item><item><title><![CDATA[Android Protobuf序列化]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/121513545</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/121513545</guid><author>wsq_tomato</author><pubDate>Wed, 24 Nov 2021 13:40:52 +0800</pubDate><description><![CDATA[protobuf序列化

proto文件生成java文件
Android studio集成Gradle Plugin for Protobuf插件

project build.gradle

buildscript { 
    dependencies {
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18'
    }
}

protobuf-gradle-plugin github
注：protobuf-gradl]]></description><category></category></item><item><title><![CDATA[Kotlin征途之data class [数据类]]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/119420989</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/119420989</guid><author>wsq_tomato</author><pubDate>Thu, 05 Aug 2021 16:21:53 +0800</pubDate><description><![CDATA[Kotlin之data class [数据类]
kotlin正常声明一个类的方式class [类名]，与java类似
kotlin对类的声明还可以用data关键字来标记那些只用来保存数据的类，将其称之为数据类
eg：
data class User constructor(val name: String) {

    var nickName: String = ""

}

例如上面的user类就是声明的一个数据类
数据类的声明必须满足下列的要求：


主构造函数至少需要有一个参数


主构造函数的所]]></description><category></category></item><item><title><![CDATA[读书小记——Activity]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/87716374</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/87716374</guid><author>wsq_tomato</author><pubDate>Tue, 19 Feb 2019 16:27:38 +0800</pubDate><description><![CDATA[Activity读书小记
首先是Activity的生命周期，简单回顾：


onCreate：创建。


onStart：可见不可交互，即未位于前台。


onResume：可见可交互，即已位于前台。


onPause：可见但不可交互。


onStop：停止，不可见不可交互


onDestroy：销毁。


onReStart：重新启动。即执行完onPause和onStop但未执行onDes...]]></description><category></category></item><item><title><![CDATA[Android暴露组件——被忽略的组件安全]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/83349812</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/83349812</guid><author>wsq_tomato</author><pubDate>Wed, 31 Oct 2018 20:44:25 +0800</pubDate><description><![CDATA[Intent
简介： Intent（意图），负责完成Android应用、组件之间的交互与通信。
常见的Activity的调用、Receiver的发送、Service的启动都需离不开Intent。
Intent通常包含的信息：

Categpry：种类、归类。
Action：表明要做什么？通常代表了一个组件具有的能力。
Data/Extras：通信的数据。
Flags：规定了系统如何去启动一个Act...]]></description><category></category></item><item><title><![CDATA[Git手册]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/82715325</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/82715325</guid><author>wsq_tomato</author><pubDate>Sat, 15 Sep 2018 16:38:02 +0800</pubDate><description><![CDATA[Git





基本设置篇



配置用户信息

配置用户名：git config –system user.name “name” 
配置邮箱：git config –system user.email “email@.com” 
对应/etc/gitconfig文件，系统全局配置，作用于所有用户

配置用户名：git config –global user.name “name” 
配置邮箱...]]></description><category></category></item><item><title><![CDATA[ThreadLocal，看我就够了！]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/82390262</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/82390262</guid><author>wsq_tomato</author><pubDate>Tue, 04 Sep 2018 20:59:54 +0800</pubDate><description><![CDATA[ThreadLocal





开胃菜

 研究过Handler的应该对ThreadLocal比较眼熟的，线程中的Handler对象就是通过ThreadLocal来存放的。初识ThreadLocal的可能被它的名字有所误导，ThreadLocal初一看可能会觉得这是某种线程实现，而实际并非如此。事实上，它是一个全局变量，用来存储对应Thread的本地变量，这也是为什么将其称之为Local。当使用...]]></description><category></category></item><item><title><![CDATA[Handler进阶之sendMessage原理探索]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/80893990</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/80893990</guid><author>wsq_tomato</author><pubDate>Tue, 03 Jul 2018 09:51:49 +0800</pubDate><description><![CDATA[Handler进阶之sendMessage



 本文主要进一步的探索Handler，主要介绍下Handler是如何发送消息的？ 
 用过Handler的想必对一下几个方法都不会陌生：



sendMessage(Message msg);//立刻发送消息
sendMessageAtTime(Message msg, long atTime);//在某个时间点发送消息
sendMessageD...]]></description><category></category></item><item><title><![CDATA[Android 内存优化合集（不定期更新中......欢迎提供素材）]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/80857722</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/80857722</guid><author>wsq_tomato</author><pubDate>Fri, 29 Jun 2018 15:38:46 +0800</pubDate><description><![CDATA[一、Android内存优化合集之消除对象的过期引用

]]></description><category></category></item><item><title><![CDATA[Android内存优化合集：消除过期对象的引用]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/80857615</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/80857615</guid><author>wsq_tomato</author><pubDate>Fri, 29 Jun 2018 15:33:39 +0800</pubDate><description><![CDATA[消除过期对象的引用

 在Java编码的过程中，只要类是自己管理内存的，就要警惕对象的回收，防止出现 
内存泄漏的问题。 
对象的过期引用，是指在不再会使用到引用永远也不会也不会再被解除引用。 
举个例子说明下：



public class Stack&amp;amp;lt;T&amp;amp;gt; {
    private Object[] mElements;
    private int mSize;
    p...]]></description><category></category></item><item><title><![CDATA[Android自定义View之onLayout]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/80323719</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/80323719</guid><author>wsq_tomato</author><pubDate>Tue, 15 May 2018 15:35:01 +0800</pubDate><description><![CDATA[onLayout



 写过自定义ViewGroup的都知道，当自定义一个类继承ViewGroup之后，必须要重写的一个方法就是onLayout。 
那么onLayout有什么样的作用呢？为什么自定义ViewGroup就需要重写该方法，自定义View则不需要重写该方法？ 
疑问出在ViewGroup的onLayout里，那我们就从这里入手，逐一去分析各中原由。 
 首先，进入到ViewGruop...]]></description><category></category></item><item><title><![CDATA[HandlerThread原理和实际应用]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/80310554</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/80310554</guid><author>wsq_tomato</author><pubDate>Mon, 14 May 2018 15:47:41 +0800</pubDate><description><![CDATA[HandlerThread



 在理解了Handler的原理之后，我们知道在一个子线程中创建一个Handler不能缺少了Looper.prepare()和Looper.loop() 
两个方法，具体的原因这里不再赘述，不熟悉原理的可以先看下另一篇文章Handler的原理解析. 
本篇文章主要是讲解HandlerThread的使用的。 
 首先HandlerThread是继承于Thread类的，...]]></description><category></category></item><item><title><![CDATA[Android Handler消息机制原理最全解读（持续补充中）]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/80301851</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/80301851</guid><author>wsq_tomato</author><pubDate>Sun, 13 May 2018 19:22:57 +0800</pubDate><description><![CDATA[Handler

 在Android开发的过程中，我们常常会将耗时的一些操作放在子线程（work thread）中去执行，然后将执行的结果告诉 
UI线程（main thread），熟悉Android的朋友都知道，UI的更新只能通过Main thread来进行。那么这里就涉及到了如何将 
子线程的数据传递给main thread呢？ 
 Android已经为我们提供了一个消息传递的机制——Hand...]]></description><category></category></item><item><title><![CDATA[Android自定义View之View的测量onMeasure]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/80292143</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/80292143</guid><author>wsq_tomato</author><pubDate>Sat, 12 May 2018 15:51:46 +0800</pubDate><description><![CDATA[Android自定义View之——View的测量

 View的测量是通过函数measure来完成的，measure函数是由final进行修饰的，也就是说子类是无法重写该方法的。 
 通过View的源码可以看到，measure里面实际调用了onMeasure方法，该方法是可以被重写的。也就是在自定义View的时候， 
测量View的尺寸大小通过重写onMeasure方法来完成。  



prot...]]></description><category></category></item><item><title><![CDATA[读书小记——JAVA数据容器总结]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/80050108</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/80050108</guid><author>wsq_tomato</author><pubDate>Mon, 23 Apr 2018 14:32:22 +0800</pubDate><description><![CDATA[数组：

数组是指将相同类型的元素按照一定顺序进行排列的集合，数组的存储是一块固定长度的连续的存储空间。 
eg:当我们在声明一个数组时是需要指定其长度的



int[] data = new int[10];

数组的存储是连续的，因此只要知道第一个元素的存储位置，对应的就能知道后面所有元素的位置， 
随机访问一个元素的时间复杂度是O(1)。 
数组删除/增加一个元素，需要移动删除/增加位置之...]]></description><category></category></item><item><title><![CDATA[Java设计模式之装饰者模式——代码里的故事——]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/79901203</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/79901203</guid><author>wsq_tomato</author><pubDate>Wed, 11 Apr 2018 18:56:13 +0800</pubDate><description><![CDATA[装饰者模式





引入：

 装饰者模式，从字面上一看就能很容易联想到这是用来扩展一个类的，可以时扩展一个类是他具有某些属性和功能(方法)， 
那么，就有人会说了，扩展一个类，我在写一个子类继承他，然后在扩展对应的属性或者功能不就行了，为什么要用装饰者模式呢？难道他有什么独特的地方吗？ 
带着这个疑问，接下来就让我们去看看装饰者模式到底是怎样一回事呢？ 
 现在我们有一场戏需要拍一下，在一个浪...]]></description><category></category></item><item><title><![CDATA[Java设计模式之模板方法设计模式——代码里的故事————]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/79518729</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/79518729</guid><author>wsq_tomato</author><pubDate>Sun, 11 Mar 2018 18:36:58 +0800</pubDate><description><![CDATA[Java设计模式，写漂亮的代码



————模板方法设计模式





简介：

 模板方法设计模式是Java设计模式中很简单、应用非常广泛的的一种设计模式，该模式体现了编程的抽象思想（抽象是所有子类的共性封装）， 
仅仅使用了Java的继承机制。其实很可能在你写代码的过程中已经使用过了很多次这种模式，只是你还不太清楚那就是模板方法设计模式。 
 接下来就让我们一起去看看，到底什么是模板方法设计...]]></description><category></category></item><item><title><![CDATA[Android 8.0 新特性之语言区国际化和隐私性]]></title><link>https://blog.youkuaiyun.com/wsq_tomato/article/details/79180475</link><guid>https://blog.youkuaiyun.com/wsq_tomato/article/details/79180475</guid><author>wsq_tomato</author><pubDate>Sat, 27 Jan 2018 14:56:18 +0800</pubDate><description><![CDATA[语言区域和国际化

Android 7.0引入了能指定默认类别语言区域的概念，某些API在使用默认的DISPLAY类别语言区域时，仍然使用的是不带参数Locale.getDefault()函数。在Android  8.0，以下的一些函数使用Locale.getDefault(Category.DISPLAY)来代 
 
Locale.getDefault(): 
Currency.getDispl]]></description><category></category></item></channel></rss>