<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Victor_Zhang_SH的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Victor_Zhang_SH</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Victor_Zhang_SH]]></copyright><item><title><![CDATA[深入了解RTSP协议]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/54291042</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/54291042</guid><author>Victor_Zhang_SH</author><pubDate>Mon, 09 Jan 2017 17:35:40 +0800</pubDate><description><![CDATA[1. RTSP连接的建立过程  RTSPServer类用于构建一个RTSP服务器，该类同时在其内部定义了一个RTSPClientSession类，用于处理单独的客户会话。  首先创建RTSP服务器(具体实现类是DynamicRTSPServer)，在创建过程中，先建立Socket(ourSocket)在TCP的554端口进行监听，然后把连接处理函数句柄(RTSPServer::incomingCon]]></description><category></category></item><item><title><![CDATA[应用安装]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53995446</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53995446</guid><author>Victor_Zhang_SH</author><pubDate>Tue, 03 Jan 2017 16:13:38 +0800</pubDate><description><![CDATA[在应用程序中安装程序需要权限 
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
示例代码 
安卓中提供了安装程序的功能，我们只要启动安装程序的Activity，并把我们的数据传入即可。//获取到要安装的apk文件的File对象
File file = new File(Environment.getExte]]></description><category></category></item><item><title><![CDATA[Ant打包]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53993883</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53993883</guid><author>Victor_Zhang_SH</author><pubDate>Tue, 03 Jan 2017 13:58:23 +0800</pubDate><description><![CDATA[Ant打包使用步骤： 
1. 对于已经存在的工程需要利用Ant命令更新一下： 
    android update project -n Test -p D:/workspace/Test -s -t 1 
　　-n (name) 后面跟的是这个工程的名子 
　　-p (path)后面跟的是这个工程的目录路径 
　　-t (target)后面是当前共有的SDK版本。表明我们的目标版本(如果有了pr]]></description><category></category></item><item><title><![CDATA[深入剖析 JVM]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53695276</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53695276</guid><author>Victor_Zhang_SH</author><pubDate>Fri, 16 Dec 2016 16:53:23 +0800</pubDate><description><![CDATA[JVM内存模型以及分区，需要详细到每个区放什么。http://blog.youkuaiyun.com/ns_code/article/details/17565503JVM所管理的内存分为以下几个运行时数据区：程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。程序计数器(Program Counter Register)一块较小的内存空间，它是当前线程所执行的字节码的行号指示器，字节码解释器工作时通]]></description><category></category></item><item><title><![CDATA[深入理解 Synchronized]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53695219</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53695219</guid><author>Victor_Zhang_SH</author><pubDate>Fri, 16 Dec 2016 16:50:15 +0800</pubDate><description><![CDATA[synchronized在并发编程中，多线程同时并发访问的资源叫做临界资源，当多个线程同时访问对象并要求操作相同资源时，分割了原子操作就有可能出现数据的不一致或数据不完整的情况，为避免这种情况的发生，我们会采取同步机制，以确保在某一时刻，方法内只允许有一个线程。采用synchronized修饰符实现的同步机制叫做互斥锁机制，它所获得的锁叫做互斥锁。每个对象都有一个monitor(锁标记)，当线程拥有]]></description><category></category></item><item><title><![CDATA[事件分发机制]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53695203</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53695203</guid><author>Victor_Zhang_SH</author><pubDate>Fri, 16 Dec 2016 16:48:47 +0800</pubDate><description><![CDATA[事件分发机制
对于一个根ViewGroup来说,发生点击事件首先调用dispatchTouchEvent
如果这个ViewGroup的onIterceptTouchEvent返回true就表示它要拦截当前事件,接着这个ViewGroup的onTouchEvent就会被调用.如果onIterceptTouchEvent返回false,那么就会继续向下调用子View的dispatchTouchEvent]]></description><category></category></item><item><title><![CDATA[Zygote和System进程的启动过程]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53695174</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53695174</guid><author>Victor_Zhang_SH</author><pubDate>Fri, 16 Dec 2016 16:47:33 +0800</pubDate><description><![CDATA[Zygote和System进程的启动过程init脚本的启动+------------+    +-------+   +-----------+
|Linux Kernel+--> |init.rc+-> |app_process|
+------------+    +-------+   +-----------+
               create and public]]></description><category></category></item><item><title><![CDATA[责任链模式]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53695094</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53695094</guid><author>Victor_Zhang_SH</author><pubDate>Fri, 16 Dec 2016 16:42:53 +0800</pubDate><description><![CDATA[责任链模式模式介绍模式的定义一个请求沿着一条“链”传递，直到该“链”上的某个处理者处理它为止。模式的使用场景一个请求可以被多个处理者处理或处理者未明确指定时。]]></description><category></category></item><item><title><![CDATA[原型模式]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53695077</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53695077</guid><author>Victor_Zhang_SH</author><pubDate>Fri, 16 Dec 2016 16:41:57 +0800</pubDate><description><![CDATA[原型模式模式介绍模式的定义用原型实例指定创建对象的种类，并通过拷贝这些原型创建新的对象。模式的使用场景
类初始化需要消化非常多的资源，这个资源包括数据、硬件资源等，通过原型拷贝避免这些消耗；
通过 new 产生一个对象需要非常繁琐的数据准备或访问权限，则可以使用原型模式；
一个对象需要提供给其他对象访问，而且各个调用者可能都需要修改其值时，可以考虑使用原型模式拷贝多个对象供调用者使用，即保护性拷贝。]]></description><category></category></item><item><title><![CDATA[外观模式]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53695067</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53695067</guid><author>Victor_Zhang_SH</author><pubDate>Fri, 16 Dec 2016 16:40:59 +0800</pubDate><description><![CDATA[外观模式定义为子系统中的一组接口提供一个一致的界面，Facade模式定义了一个高层接口，这个接口使得这一子系统更加容易使用。外观模式的目的不是给子系统添加新的功能接口，而是为了让外部减少与子系统内多个模块的交互，松散耦合，从而让外部能够更简单的使用子系统。优缺点
优点 
松散耦合
简单易用
更好的划分访问的层次
缺点 
过多的或者是不太合理的Facade也容易让人迷惑。到底是调用Facade好还是直]]></description><category></category></item><item><title><![CDATA[适配器模式]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53581053</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53581053</guid><author>Victor_Zhang_SH</author><pubDate>Mon, 12 Dec 2016 11:47:22 +0800</pubDate><description><![CDATA[适配器模式定义：
  将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
功能：
  进行转换匹配，目的是复用已有的功能，而不是来实现新的接口。在适配器里实现功能，这种适配器称为智能适配器。
优点：
更好的复用性
更好的扩展性
缺点：
过多的使用适配器，会让系统非常零乱，不容易整体进行把握。
本质：转换匹配，复用功能。何时选用适配器模式：]]></description><category></category></item><item><title><![CDATA[简单工厂模式]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53581035</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53581035</guid><author>Victor_Zhang_SH</author><pubDate>Mon, 12 Dec 2016 11:45:33 +0800</pubDate><description><![CDATA[简单工厂接口接口是一种特殊的抽象类，跟一般的抽象类相比，接口里的所有方法都是抽象方法，接口里的所有属性都是常量。也就是说接口里面只有方法定义没有任何方法实现。接口的思想是”封装隔离”简单工厂示例代码： 
https://github.com/GeniusVJR/DesignMode_Java/tree/master/SimpleFactory客户端在调用的时候，不但知道了接口，同时还知道了具体的实现]]></description><category></category></item><item><title><![CDATA[观察者模式]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53581017</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53581017</guid><author>Victor_Zhang_SH</author><pubDate>Mon, 12 Dec 2016 11:44:21 +0800</pubDate><description><![CDATA[观察者模式首先在Android中，我们往ListView添加数据后，都会调用Adapter的notifyDataChanged()方法，其中使用了观察者模式。当ListView的数据发生变化时，调用Adapter的notifyDataSetChanged函数，这个函数又会调用DataSetObservable的notifyChanged函数，这个函数会调用所有观察者(AdapterDataSetOb]]></description><category></category></item><item><title><![CDATA[单例设计模式]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53545589</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53545589</guid><author>Victor_Zhang_SH</author><pubDate>Fri, 09 Dec 2016 22:28:22 +0800</pubDate><description><![CDATA[单例模式定义
  保证一个类仅有一个实例，并提供一个访问它的全局访问点。
  
  Singleton:负责创建Singleton类自己的唯一实例，并提供一个getInstance的方法，让外部来访问这个类的唯一实例。饿汉式： 
 
private static Singleton uniqueInstance = new Singleton(); 懒汉式 
 
private static Sin]]></description><category></category></item><item><title><![CDATA[代理模式]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53544148</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53544148</guid><author>Victor_Zhang_SH</author><pubDate>Fri, 09 Dec 2016 21:06:20 +0800</pubDate><description><![CDATA[代理模式模式介绍代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象，并由代理对象控制对原对象的引用。模式的使用场景就是一个人或者机构代表另一个人或者机构采取行动。在一些情况下，一个客户不想或者不能够直接引用一个对象，而代理对象可以在客户端和目标对象之间起到中介的作用。角色介绍
抽象对象角色：声明了目标对象和代理对象的共同接口，这样一来在任何可以使用目标对象的地方都可以使用代理对象。
目标]]></description><category></category></item><item><title><![CDATA[[置顶]常见面向对象原则]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53544129</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53544129</guid><author>Victor_Zhang_SH</author><pubDate>Fri, 09 Dec 2016 21:03:23 +0800</pubDate><description><![CDATA[常见的面向对象设计原则
单一职责原则 SRP 
一个类应该仅有一个引起它变化的原因。
开放关闭原则 OCP 
一个类应该对外扩展开放，对修改关闭。
里氏替换原则 LSP 
子类型能够替换掉它们的父类型。
依赖倒置原则 DIP 
要依赖于抽象，不要依赖于具体类，要做到依赖倒置，应该做到： 
高层模块不应该依赖底层模块，二者都应该依赖于抽象。
抽象不应该依赖于具体实现，具体实现应该依赖于抽象。
接口隔离]]></description><category></category></item><item><title><![CDATA[策略模式]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53544124</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53544124</guid><author>Victor_Zhang_SH</author><pubDate>Fri, 09 Dec 2016 21:02:00 +0800</pubDate><description><![CDATA[策略模式模式的定义策略模式定义了一系列的算法，并将每一个算法封装起来，而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。注：针对同一类型操作，将复杂多样的处理方式分别开来，有选择的实现各自特有的操作。模式的使用场景
针对同一类型问题的多种处理方式，仅仅是具体行为有差别时。
需要安全的封装多种同一类型的操作时。
出现同一抽象多个子类，而又需要使用if-else 或者 switch-]]></description><category></category></item><item><title><![CDATA[深入理解 String AOP]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53544107</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53544107</guid><author>Victor_Zhang_SH</author><pubDate>Fri, 09 Dec 2016 20:59:00 +0800</pubDate><description><![CDATA[什么是AOPAOP（Aspect-OrientedProgramming，面向方面编程），可以说是OOP（Object-Oriented Programing，面向对象编程）的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构，用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候，OOP则显得无能为力。也就是说，OOP允许你定义从上到下的关系，但并不适合定义从左到右]]></description><category></category></item><item><title><![CDATA[Builder 模式]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53525032</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53525032</guid><author>Victor_Zhang_SH</author><pubDate>Thu, 08 Dec 2016 21:32:53 +0800</pubDate><description><![CDATA[Builder模式模式介绍模式的定义将一个复杂对象的构建与它的表示分离，使得同样的构建过程可以创建不同的表示。模式的使用场景
相同的方法，不同的执行顺序，产生不同的事件结果时；
多个部件或零件，都可以装配到一个对象中，但是产生的运行结果又不相同时；
产品类非常复杂，或者产品类中的调用顺序不同产生了不同的效能，这个时候使用建造者模式非常合适；
Android源码中的模式实现在Android源码中，我们]]></description><category></category></item><item><title><![CDATA[从源码分析 HashMap]]></title><link>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53525004</link><guid>https://blog.youkuaiyun.com/Victor_Zhang_SH/article/details/53525004</guid><author>Victor_Zhang_SH</author><pubDate>Thu, 08 Dec 2016 21:29:12 +0800</pubDate><description><![CDATA[HashMapHashMap和Hashtable的区别：
Hashtable的大部分方法做了同步，HashMap没有，因此，HashMap不是线程安全的。
Hashtable不允许key或者value使用null值，而HashMap可以。
在内部算法上，它们对key的hash算法和hash值到内存索引的映射算法不同。
HashMap的实现原理简单说，HashMap就是将key做hash算法，然后将h]]></description><category></category></item></channel></rss>