<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[多学习，多读书]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/immrwk</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; immrwk]]></copyright><item><title><![CDATA[LeakCannary使用方法及实现原理探究（二）—— LeakCannary实现原理及源码分析]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/83094912</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/83094912</guid><author>immrwk</author><pubDate>Tue, 16 Oct 2018 17:43:41 +0800</pubDate><description><![CDATA[写在前头
这里首先将LeakCannary的原理写在这里，让大家有一个初步的印象，然后我们再一步步去分析具体的实现逻辑
LeakCannary原理
1. Activity onDestroy之后将它放到一个WeakReference
2. 这个WeakReference关联到一个ReferenceQueue
3. 查看ReferenceQueue是否存在 Activity的引用
4. 如果该Aci...]]></description><category></category></item><item><title><![CDATA[LeakCannary使用方法及实现原理探究（一）—— 使用方法简述]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/83062326</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/83062326</guid><author>immrwk</author><pubDate>Mon, 15 Oct 2018 17:50:09 +0800</pubDate><description><![CDATA[
leakcannary
##简介
LeakCanary是Square公司研发的一个可视化的内存泄漏分析工具，github地址为https://github.com/square/leakcanary。
它的使用非常简单，下面我们将一步步进行分析。
##集成LeakCannary
在我们的build.gradle中添加如下依赖：
dependencies {
  debugImplementati...]]></description><category></category></item><item><title><![CDATA[Java注解]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/82761002</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/82761002</guid><author>immrwk</author><pubDate>Tue, 18 Sep 2018 18:01:32 +0800</pubDate><description><![CDATA[##注解的定义

Java注解是在JDK5时引入的新特性，Java 注解用于为 Java 代码提供元数据。作为元数据，注解不直接影响你的代码执行，但也有一些类型的注解实际上可以用于这一目的。

当然这样解释可能比较晦涩难懂，注解可以简单理解为对一段代码的说明解释。
##注解语法
###注解的写法
public @interface MyAnnotation {
}

跟接口的写法类似，在inter...]]></description><category></category></item><item><title><![CDATA[算法题整理（持续更新）]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/80393983</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/80393983</guid><author>immrwk</author><pubDate>Tue, 11 Sep 2018 14:41:43 +0800</pubDate><description><![CDATA[1.一个按升序排列好的数组int[] arry = {-5,-1,0,5,9,11,13,15,22,35,46},输入一个x，int x = 31，在数据中找出和为x的两个数，例如 9 + 22 = 31，要求算法的时间复杂度为O(n);

分析：该题不难，主要关注点应该为要求时间复杂度为O(n),因为数组是按升序排列，所以可以定义两个指针i、j，分别从数组的两端开始遍历，如果a[i]+a[j]...]]></description><category></category></item><item><title><![CDATA[Android 网络请求框架volley源码解析（二） —— volley缓存原理]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/82590812</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/82590812</guid><author>immrwk</author><pubDate>Mon, 10 Sep 2018 15:47:44 +0800</pubDate><description><![CDATA[Volley的缓存目录

通过上一篇分析中我们发现，创建一个请求队列的同时，会同时创建Volley的缓存目录和DiskBasedCache缓存对象，我们可以得知Volley的缓存目录就是在我们应用内置的cacheDir目录下的volley文件夹中，然后把这个目录用作DiskBasedCache硬盘缓存的目录，源码如下：



public static RequestQueue newReques...]]></description><category></category></item><item><title><![CDATA[Android 网络请求框架volley源码解析（一） —— 网络请求部分]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/82499674</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/82499674</guid><author>immrwk</author><pubDate>Fri, 07 Sep 2018 17:08:02 +0800</pubDate><description><![CDATA[
  volley是google提供的一个网络通信框架，非常适合我们进行一些数据量不大、频繁的网络通信操作。这是一个开源项目，地址为https://github.com/google/volley，今天我们就分章节来分析一下volley框架源码，探寻它内部的实现机制。


基本使用

这里列举一个volley最基本的用法，通过该用法入手，来一步步分析volley是怎么进行网络通信的。



Req...]]></description><category></category></item><item><title><![CDATA[Android Avtivity setContentView源码分析]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/82381191</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/82381191</guid><author>immrwk</author><pubDate>Tue, 04 Sep 2018 11:43:05 +0800</pubDate><description><![CDATA[前言


  平时我们开发过程中，给Activity设置布局的时候，直接调用的setContentView，然后我们在xml布局文件中写的布局就可以显示出来，那这个过程到底是怎么样的呢，今天我们来分析一下，setContentView都做了什么。




Activity setContentView

首先我们看Activity的setContentView方法，这个方法有几个重载:



pu...]]></description><category></category></item><item><title><![CDATA[Android Handler机制源码分析]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/82257250</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/82257250</guid><author>immrwk</author><pubDate>Fri, 31 Aug 2018 15:36:43 +0800</pubDate><description><![CDATA[
  本文分析基于android-25


Handler是Android系统提供给我们的一个工具，主要用于多线程间的通讯，比如更新UI等等。

一、Handler常见用法

1. 
首先定义一个Handler，并重写handlerMessage方法，当收到消息时，根据msg.what判断来源，然后进行相关操作，这里是更新了一个textView的显示文字。



private Handler m...]]></description><category></category></item><item><title><![CDATA[HashMap中几点需要注意的地方]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/80757081</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/80757081</guid><author>immrwk</author><pubDate>Thu, 21 Jun 2018 10:48:46 +0800</pubDate><description><![CDATA[
HashMap本身的算法保证，会使key hash之后下标的分布尽可能的分散
2倍扩容的做法是为了保证分散性，扩容完成之后，要把原来的节点移动一下，链表的位置要么是原来的位置不动，要么是原来的位置+oldCap
位置相同时,后面的节点用链表挂在下面，当链表长度超过8个时，将链表转为用红黑树存储（jdk1.8之后）
get的时候回根据hash和key共同决定取哪个,先看hash是否相同，再看key...]]></description><category></category></item><item><title><![CDATA[Android finish()自动回调时机，Activity资源释放逻辑放在onDestroy中一定合适吗]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/80265289</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/80265289</guid><author>immrwk</author><pubDate>Thu, 10 May 2018 11:37:59 +0800</pubDate><description><![CDATA[首先看Google对finish()的描述，


  Call this when your activity is done and should be closed.  The 
      ActivityResult is propagated back to whoever launched you via 
      onActivityResult().


 当activity完...]]></description><category></category></item><item><title><![CDATA[Java基础提高 String与String.intern()]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/80226112</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/80226112</guid><author>immrwk</author><pubDate>Mon, 07 May 2018 15:10:29 +0800</pubDate><description><![CDATA[首先看一段代码，思考运行结果

String s0 = new String(&quot;ab&quot;);
String s1 = new String(&quot;ab&quot;);
String s2 = &quot;ab&quot;;
String s3 = &quot;a&quot; + &quot;b&quot;;
String s4 = &quot;b&quot;;
String s5 = &quot;a&quot; + s4;

System.out.println(s1.intern(]]></description><category></category></item><item><title><![CDATA[Android 消息路由框架]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/79894376</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/79894376</guid><author>immrwk</author><pubDate>Wed, 11 Apr 2018 11:57:22 +0800</pubDate><description><![CDATA[本文主要介绍消息路由框架的机制和原理

消息框架的作用


  可以方便在不同moudle之间的通信，减少互相依赖


路由机制的原理

MoudleA通过消息路由来分发一个任务到MoudleB,而避免MoudleA直接依赖MoudleB。  

需要被执行的任务首先需要进行注册，任务id是唯一的，该注册可以通过写到类的static静态代码块当中，这样当该类被加载的时候这个任务便可以被注册。(后面...]]></description><category></category></item><item><title><![CDATA[Android如何在service中弹出对话框]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/79530553</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/79530553</guid><author>immrwk</author><pubDate>Mon, 12 Mar 2018 17:55:00 +0800</pubDate><description><![CDATA[最近又听人聊到Android能不能在service中弹出对话框的问题，于是总结一下 
答案是肯定的，系统可以在低电量的时候弹出电量不足的提示，那么我们也可以按同样的方法做到 
下面介绍在service中弹出对话框的两种方法：



1.将dialog的Type设置为TYPE_SYSTEM_ALERT

写一个service代码如下：



public class DialogService ex...]]></description><category></category></item><item><title><![CDATA[Android应用中的图片缓存策略]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/79487525</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/79487525</guid><author>immrwk</author><pubDate>Thu, 08 Mar 2018 17:33:36 +0800</pubDate><description><![CDATA[Android图片缓存的基本思路整理
缓存方式主要分为网络缓存，内存缓存，文件缓存
这里简单介绍一下后面两种的思路，使用内存缓存和使用文件缓存
缓存的基本原理，将从网络中得到的图片存储在本地，避免再次使用时从网络重新加载，可以增快加载速度，减少网络流量的消耗]]></description><category></category></item><item><title><![CDATA[JsonObject toString() 输出键值对顺序研究]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/79354562</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/79354562</guid><author>immrwk</author><pubDate>Fri, 23 Feb 2018 16:23:22 +0800</pubDate><description><![CDATA[后台有一套接口，需要对传参进行排序，于是写了一套排序方法，在请求接口之前对所有参数排序，这里边用到了JsonObject及其自身的toString方法，测试过程中发现在一台android4.4系统的手机上程序运行不是预期结果，于是有了下面的研究]]></description><category></category></item><item><title><![CDATA[shell中的xargs命令]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/52578084</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/52578084</guid><author>immrwk</author><pubDate>Sun, 18 Sep 2016 21:30:20 +0800</pubDate><description><![CDATA[shell中的xargs命令xargs命令的作用是将参数列表转换成小块分段传递给其他命令，以避免参数列表过长的问题]]></description><category></category></item><item><title><![CDATA[Android中实现虚线边框包裹文字的两种方式]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/52444116</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/52444116</guid><author>immrwk</author><pubDate>Mon, 05 Sep 2016 21:45:51 +0800</pubDate><description><![CDATA[下面介绍实现下图所示效果的两种方式：

  



第一种是通过写shape布局文件来实现

给TextView设置background时引用此布局文件即可实现效果，shape布局文件代码如下：  



&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;shape xmlns:android=&quot;http://schemas.android.com/...]]></description><category></category></item><item><title><![CDATA[设置Intent.FLAG_ACTIVITY_NEW_TASK和Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED对Activity Stack的影响]]></title><link>https://blog.youkuaiyun.com/immrwk/article/details/51772024</link><guid>https://blog.youkuaiyun.com/immrwk/article/details/51772024</guid><author>immrwk</author><pubDate>Mon, 27 Jun 2016 22:54:20 +0800</pubDate><description><![CDATA[这是一个小区广播问题引发的对Intent.FLAG_ACTIVITY_NEW_TASK和Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的思考
一、问题描述-删除未读广播消息后，进入短信-menu小区广播还会弹出广播提示框
预制条件 手机有一条未读广播消息
测试步骤：
1.进入设置-更多-小区广播 删除此条消息
2.进入短信-Menu-小区广播
预期结]]></description><category></category></item></channel></rss>