<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[time_hunter的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/time_hunter</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; time_hunter]]></copyright><item><title><![CDATA[PhoneWindow & Activity]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53858924</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53858924</guid><author>time_hunter</author><pubDate>Wed, 28 Dec 2016 20:41:03 +0800</pubDate><description><![CDATA[Activity的UI的层次结构




DecorView 是什么？

DecorView是ViewTree最顶层的View。



DecorView与PhoneWindow的关系



Activity的UI结构对照

一个简单的Activity：继承自Activity




UI结构对照图






Activity的UI 组建]]></description><category></category></item><item><title><![CDATA[View的绘制]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53864690</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53864690</guid><author>time_hunter</author><pubDate>Wed, 28 Dec 2016 17:40:54 +0800</pubDate><description><![CDATA[将View添加到WindowManagerService的过程





1 : ActivityThread.handleResumeActivity


从上面可知，WindowManager是通过Activity的getWindowManager获取到的

更进一步，发现WindowManager是在attach的时候被赋值的。


mWindowManager又]]></description><category></category></item><item><title><![CDATA[Zygote & System Server & app]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53558286</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53558286</guid><author>time_hunter</author><pubDate>Fri, 23 Dec 2016 17:53:30 +0800</pubDate><description><![CDATA[Zygote：

作用：


Zygote负责fork其他的Android进程：所有的应用程序进程 ，SystemServer。
关于Zygote：

是安卓运行的第一个Dalvik虚拟机进程。/System/bin/app_process 是Zygote对应的进程。SystemServer 和 Zygote分属android操作系统不同Davik虚拟机上运行的不同进程。app_p]]></description><category></category></item><item><title><![CDATA[ViewStub的实现]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53585818</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53585818</guid><author>time_hunter</author><pubDate>Mon, 12 Dec 2016 21:17:16 +0800</pubDate><description><![CDATA[一个例子

点击按钮前





点击按钮后





UI布局文件

activity_main.xml


<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:la]]></description><category></category></item><item><title><![CDATA[Android app 优化]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/52981380</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/52981380</guid><author>time_hunter</author><pubDate>Mon, 12 Dec 2016 16:30:55 +0800</pubDate><description><![CDATA[一、内存

避免内存泄漏

内存泄漏的常见情况

不恰当的static引用。
内部类引起的外部类泄漏

内部类AsyncTask、Handler、Runnable持有context对象：

是否可以修改为静态内部类？
在Activity onDestroy的时候，是否可以remove task，remove callback?
是否可以使用Application 的con]]></description><category></category></item><item><title><![CDATA[对二维数据的一种遍历]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53515188</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53515188</guid><author>time_hunter</author><pubDate>Thu, 08 Dec 2016 11:01:41 +0800</pubDate><description><![CDATA[代码

	public static void solve(String[][] datas, int rows, int cols, int offset) {

		boolean isReturn = isEnd(rows, cols, offset);

		if (isReturn) {
			return;
		}

		int row_index = offset;
		int ]]></description><category></category></item><item><title><![CDATA[选择排序]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53409796</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53409796</guid><author>time_hunter</author><pubDate>Wed, 30 Nov 2016 16:24:37 +0800</pubDate><description><![CDATA[代码
public class SelectedSort {

	public static void main(String[] args) {
		
		int[] datas = {8, 3, 7, 1, 5, 6, 4, 9, 2 };
		logs("old : ", datas);
		selectedSort(datas);
		logs("new : ", datas);
	}
]]></description><category></category></item><item><title><![CDATA[冒泡排序]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53409272</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53409272</guid><author>time_hunter</author><pubDate>Wed, 30 Nov 2016 15:56:48 +0800</pubDate><description><![CDATA[代码实现
public class BubbleSort {

	public static void main(String[] args) {
		int[] datas = { 8, 3, 7, 1, 5, 6, 4, 9, 2 };
		logs("old : ", datas);
		bubbleSort(datas);
		logs("new : ", datas);
	}
	
	p]]></description><category></category></item><item><title><![CDATA[父类的静态方法能否被子类重写]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53400625</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53400625</guid><author>time_hunter</author><pubDate>Tue, 29 Nov 2016 21:42:12 +0800</pubDate><description><![CDATA[父类的静态方法不能被子类重写
代码

Anim
public class Anim {
	
	public static void test() {
		System.out.println("Anim test static method!");
	}

}

Dog
public class Dog extends Anim {
	
	public static void test]]></description><category></category></item><item><title><![CDATA[检查单链表中是否有环]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53363773</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53363773</guid><author>time_hunter</author><pubDate>Sun, 27 Nov 2016 12:42:40 +0800</pubDate><description><![CDATA[单链表判断是否有环




判断原理

用两个指针，从头节点开始遍历，一个指针a每次走1步，一个指针b每次都2步。
如果有环，两个指针相遇前

b位于a后一位时，那么a，b指针下次相遇。b位于a后两位时，那么a，b指针下下次即将相遇。

算法实现

创建链表
	public static Node createList(int max) {
		
		boolean]]></description><category></category></item><item><title><![CDATA[四种线程池]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53282508</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53282508</guid><author>time_hunter</author><pubDate>Tue, 22 Nov 2016 15:11:14 +0800</pubDate><description><![CDATA[newCachedThreadPool用法

代码
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestMain {

	public static void main(String[] args) {
		
		ExecutorServic]]></description><category></category></item><item><title><![CDATA[Aidl实现的一个例子]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53230234</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53230234</guid><author>time_hunter</author><pubDate>Sun, 20 Nov 2016 18:54:27 +0800</pubDate><description><![CDATA[AIDL 与 Messenger的异同

对于跨进程的调用




AIDL返回值是同步的，而Messenger是异步的。Aidl调用service的方法，会等待直到service中的方法执行完毕。
AIDL在Service中会针对每个请求开启新线程来执行客户端的调用。而Messenger会把消息放在主线程的队列里。

AIDL的实现，要注意线程安全的实现

oneway ]]></description><category></category></item><item><title><![CDATA[工作线程弹toast]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53225247</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53225247</guid><author>time_hunter</author><pubDate>Sat, 19 Nov 2016 01:10:19 +0800</pubDate><description><![CDATA[创建Handler的线程必须有looper。

    public Handler(Callback callback, boolean async) {
        if (FIND_POTENTIAL_LEAKS) {
            final Class klass = getClass();
            if ((klass.isAnonymousClass]]></description><category></category></item><item><title><![CDATA[HandlerThread的实现]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53224691</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53224691</guid><author>time_hunter</author><pubDate>Fri, 18 Nov 2016 23:41:29 +0800</pubDate><description><![CDATA[主要源码

public class HandlerThread extends Thread {

    Looper mLooper;
    
    ...省略代码

    @Override
    public void run() {
        mTid = Process.myTid();
        Looper.prepare();
        synch]]></description><category></category></item><item><title><![CDATA[Service的学习]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53198489</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53198489</guid><author>time_hunter</author><pubDate>Fri, 18 Nov 2016 22:01:38 +0800</pubDate><description><![CDATA[Service

可以在后台长时间运行操作而不提供用户界面的组件。
组件可以启动服务，也可以绑定到服务。
服务可以处理网络事务，播放音乐，io操作，ContentProvider交互 等耗时操作都在后台执行。
服务在其托管进程的主线程中执行。（即不创建自己的线程，也不在单独的进程中执行（除非另外指定））



耗时操作应该在服务内创建新线程来工作。


使用Service]]></description><category></category></item><item><title><![CDATA[IntentService的实现]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53205482</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53205482</guid><author>time_hunter</author><pubDate>Thu, 17 Nov 2016 20:37:29 +0800</pubDate><description><![CDATA[简介

简化了启动服务的实现。
对于每个startService请求，均使用工作线程执行任务，且每次处理一个请求。
工作线程会执行onHandleIntent ， service会自动stop。
当service启动后，所有的请求都会在同一个工作线程中执行，单同一时间，只有一个请求在执行。


源码

/**
 * IntentService is a base class f]]></description><category></category></item><item><title><![CDATA[学习BlockCanary的实现]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53164641</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53164641</guid><author>time_hunter</author><pubDate>Tue, 15 Nov 2016 00:33:29 +0800</pubDate><description><![CDATA[Android如何获取主线程堆栈信息

Thread.getStackTrace()方法。
如何在其他线程获取主线程引用 : Looper.getMainLooper().getThread();


如何Cpu使用情况

获取Cpu总数据，来自CpuSampler的doSample方法

    @Override
    protected void doSample()]]></description><category></category></item><item><title><![CDATA[简单工厂]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53148941</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53148941</guid><author>time_hunter</author><pubDate>Sun, 13 Nov 2016 15:07:34 +0800</pubDate><description><![CDATA[类图






代码

Product

public interface Product {
	
	public void doSomething();

}


ProductA

public class ProductA implements Product {

	@Override
	public void doSomething() {
		Syste]]></description><category></category></item><item><title><![CDATA[策略模式]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53148542</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53148542</guid><author>time_hunter</author><pubDate>Sun, 13 Nov 2016 13:53:02 +0800</pubDate><description><![CDATA[类图






注意


如果在一个系统里面有许多类，它们的区别只在于它们的行为。
使用switch case 或 其他 条件判断语句的地方
一个系统需要动态的在几个算法中选择其一
使用哪个策略是由外部环境决定的


代码实现

Strategy

public interface Strategy {

	public void travelStrate]]></description><category></category></item><item><title><![CDATA[重构-读书与实践的体验]]></title><link>https://blog.youkuaiyun.com/time_hunter/article/details/53144070</link><guid>https://blog.youkuaiyun.com/time_hunter/article/details/53144070</guid><author>time_hunter</author><pubDate>Sat, 12 Nov 2016 23:54:36 +0800</pubDate><description><![CDATA[本文好多知识来源于《重构》

为何重构：

改进设计
易于理解
避免补丁循环
更快的编写新代码


何时重构：

经常，随时
添加功能时
修改bug时
代码review之后


何时不重构：

代码太混乱，不如重写
项目的最后期限


重构原则


小步进行
重构不改变代码的外观行为
重构时清楚自己是在重构，写新代码时，清楚自己在写新代码]]></description><category></category></item></channel></rss>