自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 收藏
  • 关注

原创 深入了解RTSP协议

1. RTSP连接的建立过程 RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClientSession类,用于处理单独的客户会话。 首先创建RTSP服务器(具体实现类是DynamicRTSPServer),在创建过程中,先建立Socket(ourSocket)在TCP的554端口进行监听,然后把连接处理函数句柄(RTSPServer::incomingCon

2017-01-09 17:35:40 461

原创 应用安装

在应用程序中安装程序需要权限 <uses-permission android:name="android.permission.INSTALL_PACKAGES" />示例代码 安卓中提供了安装程序的功能,我们只要启动安装程序的Activity,并把我们的数据传入即可。//获取到要安装的apk文件的File对象File file = new File(Environment.getExte

2017-01-03 16:13:38 486

原创 Ant打包

Ant打包使用步骤: 1. 对于已经存在的工程需要利用Ant命令更新一下: android update project -n Test -p D:/workspace/Test -s -t 1   -n (name) 后面跟的是这个工程的名子   -p (path)后面跟的是这个工程的目录路径   -t (target)后面是当前共有的SDK版本。表明我们的目标版本(如果有了pr

2017-01-03 13:58:23 892

原创 深入剖析 JVM

JVM内存模型以及分区,需要详细到每个区放什么。http://blog.csdn.net/ns_code/article/details/17565503JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。程序计数器(Program Counter Register)一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,字节码解释器工作时通

2016-12-16 16:53:23 435

原创 深入理解 Synchronized

synchronized在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访问对象并要求操作相同资源时,分割了原子操作就有可能出现数据的不一致或数据不完整的情况,为避免这种情况的发生,我们会采取同步机制,以确保在某一时刻,方法内只允许有一个线程。采用synchronized修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。每个对象都有一个monitor(锁标记),当线程拥有

2016-12-16 16:50:15 574

原创 事件分发机制

事件分发机制对于一个根ViewGroup来说,发生点击事件首先调用dispatchTouchEvent如果这个ViewGroup的onIterceptTouchEvent返回true就表示它要拦截当前事件,接着这个ViewGroup的onTouchEvent就会被调用.如果onIterceptTouchEvent返回false,那么就会继续向下调用子View的dispatchTouchEvent

2016-12-16 16:48:47 288

原创 Zygote和System进程的启动过程

Zygote和System进程的启动过程init脚本的启动+------------+ +-------+ +-----------+|Linux Kernel+--> |init.rc+-> |app_process|+------------+ +-------+ +-----------+ create and public

2016-12-16 16:47:33 243

原创 责任链模式

责任链模式模式介绍模式的定义一个请求沿着一条“链”传递,直到该“链”上的某个处理者处理它为止。模式的使用场景一个请求可以被多个处理者处理或处理者未明确指定时。

2016-12-16 16:42:53 248

原创 原型模式

原型模式模式介绍模式的定义用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。模式的使用场景类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等,通过原型拷贝避免这些消耗;通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式;一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。

2016-12-16 16:41:57 339

原创 外观模式

外观模式定义为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式的目的不是给子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散耦合,从而让外部能够更简单的使用子系统。优缺点优点 松散耦合简单易用更好的划分访问的层次缺点 过多的或者是不太合理的Facade也容易让人迷惑。到底是调用Facade好还是直

2016-12-16 16:40:59 320

原创 适配器模式

适配器模式定义: 将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。功能: 进行转换匹配,目的是复用已有的功能,而不是来实现新的接口。在适配器里实现功能,这种适配器称为智能适配器。优点:更好的复用性更好的扩展性缺点:过多的使用适配器,会让系统非常零乱,不容易整体进行把握。本质:转换匹配,复用功能。何时选用适配器模式:

2016-12-12 11:47:22 272

原创 简单工厂模式

简单工厂接口接口是一种特殊的抽象类,跟一般的抽象类相比,接口里的所有方法都是抽象方法,接口里的所有属性都是常量。也就是说接口里面只有方法定义没有任何方法实现。接口的思想是”封装隔离”简单工厂示例代码: https://github.com/GeniusVJR/DesignMode_Java/tree/master/SimpleFactory客户端在调用的时候,不但知道了接口,同时还知道了具体的实现

2016-12-12 11:45:33 266

原创 观察者模式

观察者模式首先在Android中,我们往ListView添加数据后,都会调用Adapter的notifyDataChanged()方法,其中使用了观察者模式。当ListView的数据发生变化时,调用Adapter的notifyDataSetChanged函数,这个函数又会调用DataSetObservable的notifyChanged函数,这个函数会调用所有观察者(AdapterDataSetOb

2016-12-12 11:44:21 257

原创 单例设计模式

单例模式定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 Singleton:负责创建Singleton类自己的唯一实例,并提供一个getInstance的方法,让外部来访问这个类的唯一实例。饿汉式: private static Singleton uniqueInstance = new Singleton(); 懒汉式 private static Sin

2016-12-09 22:28:22 259

原创 代理模式

代理模式模式介绍代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。模式的使用场景就是一个人或者机构代表另一个人或者机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。角色介绍抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。目标

2016-12-09 21:06:20 2449

原创 [置顶]常见面向对象原则

常见的面向对象设计原则单一职责原则 SRP 一个类应该仅有一个引起它变化的原因。开放关闭原则 OCP 一个类应该对外扩展开放,对修改关闭。里氏替换原则 LSP 子类型能够替换掉它们的父类型。依赖倒置原则 DIP 要依赖于抽象,不要依赖于具体类,要做到依赖倒置,应该做到: 高层模块不应该依赖底层模块,二者都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。接口隔离

2016-12-09 21:03:23 237

原创 策略模式

策略模式模式的定义策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。注:针对同一类型操作,将复杂多样的处理方式分别开来,有选择的实现各自特有的操作。模式的使用场景针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。需要安全的封装多种同一类型的操作时。出现同一抽象多个子类,而又需要使用if-else 或者 switch-

2016-12-09 21:02:00 367

原创 深入理解 String AOP

什么是AOPAOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右

2016-12-09 20:59:00 1130

原创 Builder 模式

Builder模式模式介绍模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。模式的使用场景相同的方法,不同的执行顺序,产生不同的事件结果时;多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适;Android源码中的模式实现在Android源码中,我们

2016-12-08 21:32:53 299

原创 从源码分析 HashMap

HashMapHashMap和Hashtable的区别:Hashtable的大部分方法做了同步,HashMap没有,因此,HashMap不是线程安全的。Hashtable不允许key或者value使用null值,而HashMap可以。在内部算法上,它们对key的hash算法和hash值到内存索引的映射算法不同。HashMap的实现原理简单说,HashMap就是将key做hash算法,然后将h

2016-12-08 21:29:12 289

原创 Java 内存区域与内存溢出

内存区域Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器,Java虚拟机栈,本地方法栈,Java堆,方法区。下面详细阐述各数据区所存储的数据类型。程序计数器(Program Counter Register)一块较小的内存空间,它是当前线程所执行的子节码的行号指示器,字节码解释器工作时通过

2016-12-08 21:26:26 423

原创 LinkedHashMap 源码剖析

LinkedHashMap是HashMap的子类,与HashMap有着同样的存储结构,但它加入了一个双向链表的头结点,将所有put到LinkedHashmap的节点一一串成了一个双向循环链表,因此它保留了节点插入的顺序,可以使节点的输出顺序与输入顺序相同。LinkedHashMap可以用来实现LRU算法(这会在下面的源码中进行分析)。LinkedHashMap同样是非线程安全的,只在单线程环境下使用

2016-12-08 19:44:50 455

原创 生产者和消费者问题

package 生产者消费者;public class ProducerConsumerTest { public static void main(String[] args) { PublicResource resource = new PublicResource(); new Thread(new ProducerThread(resource)).s

2016-12-08 19:42:59 299

原创 volatile变量修饰符

volatile用处说明在JDK1.2之前,Java的类型模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变的非常重要。在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另一个线程还在继续使用它在寄存器

2016-12-08 19:41:32 336

原创 Thread和Runnable实现多线程的区别

Java中实现多线程有两种方法:继承Thread、实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下优势:可以避免由于Java的单继承特性而带来的局限增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的适合多个相同程序的线程区处理同一资源的情况首先通过Thread类实现class MyT

2016-12-08 19:40:24 274

原创 Java并发基础知识

Java并发(Executor框架和多线程基础)Thread与Runable如何实现多线程Java 5以前实现多线程有两种实现方法:一种是继承Thread类;另一种是实现Runnable接口。两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活。实现Runn

2016-12-08 19:38:54 430

原创 热修复技术

热修复技术APP提早发出去的包,如果出现客户端的问题,实在是干着急,覆水难收。因此线上修复方案迫在眉睫。概述基于Xposed中的思想,通过修改c层的Method实例描述,来实现更改与之对应的java方法的行为,从而达到修复的目的。Xposed诞生于XDA论坛,类似一个应用平台,不同的是其提供诸多系统级的应用。可实现许多神奇的功能。Xposed需要以越狱为前提,像是iOS中的cydia。Xposed可

2016-12-06 21:03:44 591

原创 MVC , MVP ,MVVM 的区别

MVC,MVP,MVVM的区别MVC软件可以分为三部分视图(View):用户界面控制器(Controller):业务逻辑模型(Model):数据保存各部分之间的通信方式如下:View传送指令到ControllerController完成业务逻辑后,要求Model改变状态Model将新的数据发送到View,用户得到反馈Tips:所有的通信都是单向的。互动模式接受用户指令时,MVC可以分

2016-12-06 21:02:12 523

原创 线程通信基础分析流程

老司机们都知道,Android的线程间通信就靠Handler、Looper、Message、MessageQueue这四个麻瓜兄弟了,那么,他们是怎么运作的呢?下面做一个基于主要源代码的大学生水平的分析。 原文链接Looper(先分析这个是因为能够引出四者的关系)在Looper中,维持一个Thread对象以及MessageQueue,通过Looper的构造函数我们可以知道: private

2016-12-06 21:00:08 247

原创 事件分发机制

事件分发机制对于一个根ViewGroup来说,发生点击事件首先调用dispatchTouchEvent如果这个ViewGroup的onIterceptTouchEvent返回true就表示它要拦截当前事件,接着这个ViewGroup的onTouchEvent就会被调用.如果onIterceptTouchEvent返回false,那么就会继续向下调用子View的dispatchTouchEvent

2016-12-06 20:58:47 243

原创 EventBus 用法详解

EventBus概述EventBus是一款针对Android优化的发布/订阅(publish/subscribe)事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。简化了应用程序内各组件间、组件与后台线程间的通信。优点是开销小,代码更优雅。以及将发送者和接收者解耦。比如请求网络,等网络返回时通过Handle

2016-12-06 20:57:14 317

原创 Bitmap 的分析与使用

Bitmap的分析与使用Bitmap的创建创建Bitmap的时候,Java不提供new Bitmap()的形式去创建,而是通过BitmapFactory中的静态方法去创建,如:BitmapFactory.decodeStream(is);//通过InputStream去解析生成Bitmap(这里就不贴BitmapFactory中创建Bitmap的方法了,大家可以自己去看它的源码),我们跟进Bitm

2016-12-06 20:56:06 1061

原创 Binder机制

Binder机制首先Binder是Android系统进程间通信(IPC)方式之一。Binder使用Client-Server通信方式。Binder框架定义了四个角色:Server,Client,ServiceManager以及Binder驱动。其中Server,Client,ServiceManager运行于用户空间,驱动运行于内核空间。Binder驱动程序提供设备文件/dev/binder与用户空

2016-12-06 20:54:52 316

原创 AIDL

AIDL创建一个接口,再里面定义方法package com.example.taidl; interface ICalcAIDL { int add(int x , int y); int min(int x , int y ); } build一下gen目录下会生成ICalcAIDL.java文件/* * This file is auto-generat

2016-12-01 16:58:13 370

原创 Activity 启动过程全解析

Activity启动过程一些基本的概念ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期ActivityThread,App的真正入口。当开启App之后,会调用main()开始运行,开启消息循环队列,这就是传说中的UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作Appli

2016-12-01 16:47:08 583

原创 Android 内存泄露总结

Android 内存泄漏总结内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收。最近自己阅读了大量相关的文档资料,打算做个 总结 沉淀下来跟大家一起分享和学习,也给自己一个警示,以后 coding 时怎么避免这些情况,提高应用的体验和质量。我会从 ja

2016-12-01 16:43:02 594

原创 Android图片中的三级缓存

Android图片中的三级缓存为什么要使用三级缓存如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量。在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知所以提

2016-12-01 16:41:06 270

原创 与开发团队高效协作的8个小技巧

开发团队是每一个产品经理和产品负责人的重要合作伙伴:是团队来设计和建造实际产品。但是,要高效地引导并与团队一起工作并不是一件容易的事情。这篇文章我将分享8个使开发团队更高效合作的小技巧,从而提高创造成功产品的机会。1.管理产品,而不是团队作为产品经理或产品所有者,要专注于你的工作,要管理产品而不是团队。对产品提供指导,包括它的市场,价值主张,业务目标和主要功能。要明确分工,让ScrumMaster或

2016-11-12 22:01:21 405

原创 RecyclerView和ListView的异同

ViewHolder是用来保存视图引用的类,无论是ListView亦或是RecyclerView。只不过在ListView中,ViewHolder需要自己来定义,且这只是一种推荐的使用方式,不使用当然也可以,这不是必须的。只不过不使用ViewHolder的话,ListView每次getView的时候都会调用findViewById(int),这将导致ListView性能展示迟缓。而在Recycler

2016-10-28 22:46:33 329

原创 ListView详解

直接继承自AbsListView,AbsListView继承自AdapterView,AdapterView又继承自ViewGroup。Adpater在ListView和数据源之间起到了一个桥梁的作用RecycleBin机制RecycleBin机制是ListView能够实现成百上千条数据都不会OOM最重要的一个原因。RecycleBin是AbsListView的一个内部类。RecycleBin当

2016-10-28 22:08:10 226

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除