<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[落红不是无情物]]></title><description><![CDATA[走马西来欲到天，辞家见月数回圆]]></description><link>https://blog.youkuaiyun.com/github_39994972</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; github_39994972]]></copyright><item><title><![CDATA[尝试加载一千张照片（二）]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/102805429</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/102805429</guid><author>github_39994972</author><pubDate>Sun, 13 Oct 2019 14:21:50 +0800</pubDate><description><![CDATA[CoolGlide 是学习Glide的过程中，动手写的一个简单版本。主要是为了进一步了解Glide的设计原理。
背景
我在大三的时候写了一个简单的个人云盘，我想把手机里面的照片上传到云盘上，这之前需要展示手机里面的照片，最简单的做法就是像微信朋友圈发照片那样。但是实际上，整个网格列表特别的卡。卡的原因有两个：一是主线程中取加载Bitmap导致UI不能相应操作，二是内存中大量Bitm...]]></description><category></category></item><item><title><![CDATA[折腾 | 尝试肉体加载一千张照片（第二次尝试）]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/101105088</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/101105088</guid><author>github_39994972</author><pubDate>Sat, 21 Sep 2019 13:43:29 +0800</pubDate><description><![CDATA[愿未来的自己看到这篇文章，庆幸自己的努力。 加油！

CoolGlide 是学习Glide的过程中，动手写的一个简单版本。主要是为了进一步了解Glide的设计原理。
详细代码：GITHUB 传送门
背景
我在大三的时候写了一个简单的个人云盘，我想把手机里面的照片上传到云盘上，这之前需要展示手机里面的照片，最简单的做法就是像微信朋友圈发照片那样。但是实际上，整个网格列表特别的卡。卡的原因有两个：一...]]></description><category></category></item><item><title><![CDATA[折腾 | 尝试肉体加载一千张照片]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/92785647</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/92785647</guid><author>github_39994972</author><pubDate>Tue, 18 Jun 2019 14:15:06 +0800</pubDate><description><![CDATA[以下内容完全是探索性的尝试，加载大量照片请用Glide或者Picasso


背景，我在捣鼓一个图片上传App，我需要上传手机上的照片，首先要把照片显示出来，类似于微信发送朋友圈选取照片的场景。假说我用一个RecyclerView去显示所有的照片(1000张)。在不适用Glide的情况下，如何尽可能好的去加载这些照片。

加载一张照片可以直接
imageView.setImageBitmap(B...]]></description><category></category></item><item><title><![CDATA[基础 | View基础]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/92785305</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/92785305</guid><author>github_39994972</author><pubDate>Tue, 18 Jun 2019 14:11:52 +0800</pubDate><description><![CDATA[1. View位置参数




参数
含义
获取方式




(mLeft , mTop)  (mRight , mBottom)
左上角点和右下角点相对于父容器的坐标
getXXX()


x,y
可视View左上角的位置
getX/getY


translationX,translationY
可视View相对于视图本体的偏移量
getTranslationX/Y


mScrollX/Y
...]]></description><category></category></item><item><title><![CDATA[进阶 | Handler使用]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/92785132</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/92785132</guid><author>github_39994972</author><pubDate>Tue, 18 Jun 2019 14:10:19 +0800</pubDate><description><![CDATA[Handler运行机制
Handler的消息机制如下图所示，主要包含两个消息队列，一个是消息的回收队列，另一个是Message Q队列。


1 消息的回收队列：消息回收队列是为Handler提供消息对象的，当Handler需要发送消息时，首先从消息回收队列中获取已被清空数据的消息对象，若消息对队列中此时没有消息对象，则创建新的消息对象。当消息对象被使用后，不会直接被当做垃圾回收，而是会进入消息的...]]></description><category></category></item><item><title><![CDATA[基础 | Activity注意点总结]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/92784911</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/92784911</guid><author>github_39994972</author><pubDate>Tue, 18 Jun 2019 14:08:04 +0800</pubDate><description><![CDATA[艺术探索第一章看完之后的总结和验证



A打开B：onPause(A) -&gt; onCreate(B) -&gt; onStart(B) -&gt; onResume(B) -&gt; onStop(A)，onPause方法中不能执行耗时操作，否则影响显示效果。


在onRestoreInstanceState中恢复Bundle中数据和onCreate中恢复的区别，onRestoreI...]]></description><category></category></item><item><title><![CDATA[基础 | Service集锦]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/92784783</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/92784783</guid><author>github_39994972</author><pubDate>Tue, 18 Jun 2019 14:06:58 +0800</pubDate><description><![CDATA[1. 后台服务
后台服务分为可交互服务和不可交互服务。其区别在于启动服务的方式StartService()和bindService()。后者会返回Bind对象供Service中方法和处理结果，而前者不会。
1.1 不可交互服务
三个方法：

onCreate，用于初始化服务，只会被调用一次。
onStartService，用于执行任务，每次调用Context.startService(contex...]]></description><category></category></item><item><title><![CDATA[进阶 | Intent Service]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/92784574</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/92784574</guid><author>github_39994972</author><pubDate>Tue, 18 Jun 2019 14:05:09 +0800</pubDate><description><![CDATA[如果此时你对Service有些模糊可先简单浏览一下Andriod中各种服务

首先看一下Google给的介绍
主要的内容就是：IntentService继承Service。异步处理请求，可以自己关闭自己。所有的任务由同一个线程完成。并且是串行执行的。
作为服务，所以其优先级比一般的线程要高。IntentService封装了HandleThread和handler。
HandleThread
Ha...]]></description><category></category></item><item><title><![CDATA[进阶 | AsyncTask 源码浅析]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/92784186</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/92784186</guid><author>github_39994972</author><pubDate>Tue, 18 Jun 2019 14:01:44 +0800</pubDate><description><![CDATA[AsyncTask方便我们从异步工作切换到UI线程。虽然是异步的但是依然不建议让AsyncTask执行过大耗时操作（超过10秒），如果需要让一个线程长时间保持运行，请用线程池。AsyncTask有三个泛型四个方法需要注意。
简单介绍
三个泛型：Params用于初始化，Progress用于设置进度，Result返回的结果，如果没有参数则设置为Void。
四个方法：

onPreExecute()，...]]></description><category></category></item><item><title><![CDATA[基础 | 属性动画]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/92783962</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/92783962</guid><author>github_39994972</author><pubDate>Tue, 18 Jun 2019 13:58:48 +0800</pubDate><description><![CDATA[01 属性动画背景
属性动画出现之前，有帧动画和View动画

帧动画（FrameAnimation）就是将一个动画分成多个帧。有点类似胶卷电影。
View动画最大的缺点就是不具有交互性。监听器和View动画脱离。优点是效率高。
为了实现更丰富的动画效果，Google推出了属性动画。

02 属性动画涉及的类




类
描述




ObjectAnimator
属性动画最重要的类了



Ob...]]></description><category></category></item><item><title><![CDATA[基础 | Activity]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/92783775</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/92783775</guid><author>github_39994972</author><pubDate>Tue, 18 Jun 2019 13:56:22 +0800</pubDate><description><![CDATA[1. 活动中使用Menu
复写 OnCreateOptionsMenu(Menu menu) // 创建菜单 返回值要为TRUE，不然菜单不可见
复写 onOptionsItemSelected(MenuItem item) // 设置监听器 通过Item.getId() 来判断点击的菜单
2. 显示Intent
startActivity(new Intent(activit, OtherAct...]]></description><category></category></item><item><title><![CDATA[基础 | Broadcast]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/92783565</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/92783565</guid><author>github_39994972</author><pubDate>Tue, 18 Jun 2019 13:53:32 +0800</pubDate><description><![CDATA[全局大喇叭-广播

广播的作用：广播不允许开启新的线程，所以不能进行耗时操作。一般用来创建状态栏通知或者一个服务。

1.按照广播的机制分类：

标准广播：异步方式。所有的广播接收器几乎收到消息，不能被截断。类似于UDP的广播功能
有序广播：同步方式。链式接受，广播在传播的过程中可以被截断。

2. 广播的注册方式

动态注册，有叫代码中注册
静态注册，在AndroidManifest.xml中注...]]></description><category></category></item><item><title><![CDATA[《Kotlin入门实战》CH9 | 文件IO，正则和多线程]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/93252441</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/93252441</guid><author>github_39994972</author><pubDate>Mon, 20 May 2019 19:34:00 +0800</pubDate><description><![CDATA[文件IO，正则和多线程
得益于kotlin的扩展函数，kotlin对java中api进行了改进，对于java中好用的api直接使用，对于不好用的api进行了扩展和改进。
1 文件IO操作
读写
fun main() {
    val f = File("test.txt")

    // 写入文件
    f.writeText("hello kotl...]]></description><category></category></item><item><title><![CDATA[《Kotlin入门实战》CH8 | 泛型]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/93252254</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/93252254</guid><author>github_39994972</author><pubDate>Mon, 20 May 2019 19:33:00 +0800</pubDate><description><![CDATA[泛型
泛型是在Java5中引入的，泛型让集合框架可以重用代码，在没有泛型时候，集合框架中存储数据的类型都是Object，也就是说存入和取出数据都需要对对象进行强制类型转换。这就很可能出现错误。
1 类接口函数上使用泛型
泛型接口
interface Send&lt;T&gt;{
    fun handleMessage(t : T) : T;
}

fu...]]></description><category></category></item><item><title><![CDATA[《Kotlin入门实战》CH7 | 集合类]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/93252436</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/93252436</guid><author>github_39994972</author><pubDate>Sun, 19 May 2019 16:13:00 +0800</pubDate><description><![CDATA[集合类

在Java类库中有一套相当完整的容器集合类来持有对象。Kotlin没有去重复造轮子（Scala则是自己实现了一套集合类框架），而是在Java类库的基础上进行了改造和扩展，引入了不可变集合类，同时扩展了大量方便实用的功能，这些功能的API都在kotlin.collections包下面。

集合类概述





集合层次


Iterable 可遍历...]]></description><category></category></item><item><title><![CDATA[《Kotlin入门实战》CH6 | 扩展函数与扩展属性]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/93252250</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/93252250</guid><author>github_39994972</author><pubDate>Sun, 19 May 2019 15:17:00 +0800</pubDate><description><![CDATA[扩展函数与属性
在Java中获取String中的第一个字符，StringUtil.firstChar(str)可能是这样写的，但是要想`"ABC".firstChar()是不可能的，因为Java中String是final类，在Kotlin中就不一样了。
1. 扩展函数
给String类中添加firstChar方法
fun String.firstChar(...]]></description><category></category></item><item><title><![CDATA[《Kotlin入门实战》CH5 | 函数与函数式编程]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/93252252</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/93252252</guid><author>github_39994972</author><pubDate>Sun, 19 May 2019 14:35:00 +0800</pubDate><description><![CDATA[函数与函数式编程

函数式编程与命令式编程最大的不同是：函数式编程的焦点在于数据的映射，命令式编程（imperative programming）的焦点是解决问题的步骤。

函数式编程和命令式编程比较
fun main() {

    val list = listOf&lt;Int&gt;(1, 2, 3, 4, 5)
    
    // 函数式编...]]></description><category></category></item><item><title><![CDATA[《Kotlin入门实战》CH4 | 类与面向对象编程]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/93252249</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/93252249</guid><author>github_39994972</author><pubDate>Sun, 19 May 2019 13:11:00 +0800</pubDate><description><![CDATA[类与面向对象编程

从面向过程到面向对象，再到设计模式，架构设计，面向服务，Sass、Pass和Iass等思想，各种软
件理论思想五花八门，但万变不离其宗：
你要解决一个什么样的问题？
你的问题是哪个领域的？
你的模型（数据结构）是什么？
你的算法是什么？
你对这个世界的本质认知是怎样的？
你的业务领域的逻辑问题、流程是什么？

声明类
1. 空类
2. ...]]></description><category></category></item><item><title><![CDATA[《Kotlin入门实战》CH3 |  类型系统与可空类型]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/93252251</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/93252251</guid><author>github_39994972</author><pubDate>Thu, 16 May 2019 09:58:00 +0800</pubDate><description><![CDATA[类型系统与可空类型
Kotlin属于静态类型编程语言，编程语言中类型系统定义：

如何将数值和表达式归为不同类型
如何操作这些类型
这些类型之间如何相互作用

类型系统
1. 类型系统作用

让编译器检查无意义、无效、类型不匹配的错误代码
代码更好读懂
利于抽象 char[] str = {'a','b','c'}抽象为String str = 'abc'...]]></description><category></category></item><item><title><![CDATA[《Kotlin入门实战》CH2 |  Kotlin 语法基础]]></title><link>https://blog.youkuaiyun.com/github_39994972/article/details/93252253</link><guid>https://blog.youkuaiyun.com/github_39994972/article/details/93252253</guid><author>github_39994972</author><pubDate>Wed, 15 May 2019 21:01:00 +0800</pubDate><description><![CDATA[写在前面


kotlin 为啥用fun声明方法？
JetBrains : We use “fun” because we like it - and yes, we do know what the word means in English.




JVM语言生态



需要注意的式Kotlin是基于JVM的语言，而不是基于Java的语言，他们都可以翻译成Class字节码。

kotlin
...]]></description><category></category></item></channel></rss>