• Android Develop tools

    介绍几种Android工具 1、应用流畅度检测 Gpu Rendering 2、查找耗时操作 Method Profiling 3、内存溢出检测 Memory Profilers,MAT 官网文档http://developer.android.com/tools/performance/index.html 1、应用流畅度检测 官方文档http://developer.android.com/tools/performance/profile-gpu-rendering/index.html 可以通过开发模式的gpu呈现模式数据 adb shell dumpsys gfxinfo packagename 首先得在开发者选项打开 adb shell dumpsys gfxinfo com.facebook.katana > facebook.txt 可以通过excel生成相应的图表,也可以以条状图的形式展示。 2、查找耗时操作 Method Profiling工具,查看具体方法的调用次数,cpu占用,耗时等信息。查找可能存在的瓶颈 3、内存溢出检测 官方文档http://developer.android.com/tools/performance/comparison.html dump出来的.hprof文件可以通过eclipse的mat插件查看。 可通过如下方法安装 Eclipse - >help - > Eclipse Marketplace 找到Memory Analyzer安装。 如下图的byte数据,可以通过在mBuffer上右键 -> copy -> Save Value...

  • Android IPC

    通常意义的进程间通信有如下方式 1.无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 2.高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。 3.有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 4.消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 5.信号量( semaphore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 6.信号 ( signal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 7.共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。 8.套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。 Android系统刻意屏蔽了进程的概念,4大组件都可以实现进程间通信

  • HTTP

    简要介绍下HTTPS和HTTP HTTPS使用端口443,HTTPS和TCP/IP层之间加入了SSL层HTTP直接使用端口80和TCP/IP层通信 从上图可以看出发起http请求会经历tcp的3次握手机制 整个https流程实际上是: 使用非对称加密算法保证对称加密密钥的安全传递,然后使用对称加密来保证数据传输过程中的安全性,总体时序图如下 CA证书是由权威机构颁发(由浏览器自动去权威机构验证,意味着你可以信任他),证书的内容包含多种信息,其中就包括服务器的公钥,还包括证书有效期等等。 通过它建立我们的信任基点,就可以保证服务器公钥被正确的传递给浏览器,然后浏览器可以使用它安全的把对称加密的密钥传递给服务器,之后以此密钥加密需要传递的信息,保证了数据的安全性. 非对称加密的计算效率远远不如对称加密 http1.0和1.1的变化可以才参考http://blog.csdn.net/hguisu/article/details/8608888 rfc2616Hypertext Transfer Protocol – HTTP-1.1.txt rfc1945Hypertext Transfer Protocol – HTTP 1.0.txt 有个需要注意的地方,以下字段都是http1.1增加的 响应头含有Transfer-Encoding: chunked 时就不会有 Content-Length: 19796 请求消息中引入了range头域,响应消息中Content-Range头域声明了返回的这部分对象的偏移值和长度。(响应码为206的断点续传机制)

  • 线程同步

    Thread同步机制的比较   ThreadLocal和线程同步机制相比有什么优势呢?ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。      在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大。      而ThreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。      由于ThreadLocal中可以持有任何类型的对象,低版本JDK所提供的get()返回的是Object对象,需要强制类型转换。但JDK 5.0通过泛型很好的解决了这个问题,在一定程度地简化ThreadLocal的使用      概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。      ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。 Android的looper实现就使用了ThreadLocal存储looper,每个线程只有一个looper static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>(); sThreadLocal是个全局的静态变量,那么所有的Looper类都共享同一个sThreadLocal sThreadLocal.set操作定义如下 java.lang.ThreadLocal.java public void set(T value) { Thread currentThread = Thread.currentThread(); Values values = values(currentThread); if (values == null) { values = initializeValues(currentThread); } values.put(this, value); } 即从当前调用线程中取出values对象,然后往这个values对象存放这个Looper...

  • Android基础知识

    一、Android点击事件 二、Activity生命周期相关 三、Android签名验证机制 一、Android点击事件 跟touch事件相关的3个方法: public boolean dispatchTouchEvent(MotionEvent ev); //用来分派event public boolean onInterceptTouchEvent(MotionEvent ev); //用来拦截event public boolean onTouchEvent(MotionEvent ev); //用来处理event 拥有这三个方法的类: Activity类: Activity dispatchTouchEvent(); onTouchEvent(); View容器(ViewGroup的子类):FrameLayout、LinearLayout…… ListView、ScrollVIew…… dispatchTouchEvent(); onInterceptTouchEvent(); onTouchEvent(); View控件(非ViewGroup子类):Button、TextView、EditText… dispatchTouchEvent(); onTouchEvent(); 三个方法的用法: dispatchTouchEvent() 用来分派事件。 其中调用了onInterceptTouchEvent()和onTouchEvent(),一般不重写该方法 onInterceptTouchEvent() 用来拦截事件。 ViewGroup类中的源码实现就是{return false;}表示不拦截该事件, 事件将向下传递(传递给其子View); 若手动重写该方法,使其返回true则表示拦截,事件将终止向下传递, 事件由当前ViewGroup类来处理,就是调用该类的onTouchEvent()方法 onTouchEvent() 用来处理事件。 返回true则表示该View能处理该事件,事件将终止向上传递(传递给其父View); 返回false表示不能处理,则把事件传递给其父View的onTouchEvent()方法来处理 【注】:ViewGroup的某些子类(GridView、ScrollView...)重写了 onInterceptTouchEvent()方法,当发生ACTION_MOVE事件时,返回true进行拦截。...

  • MAC JAVA SDK6、7、8随时切换设置

    mac环境变量bash文件设置 #随时切换java678 export JAVA_6_HOME=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home export JAVA_7_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0.jdk/Contents/Home export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home export JAVA_HOME=$JAVA_7_HOME alias java8='export JAVA_HOME=$JAVA_8_HOME' alias java7='export JAVA_HOME=$JAVA_7_HOME' alias java6='export JAVA_HOME=$JAVA_6_HOME' 使用中可随时切换 shenrhMacBook:~ shenrh$ java6 shenrhMacBook:~ shenrh$ java -version java version "1.6.0_65" Java(TM) SE Runtime Environment (build 1.6.0_65-b14-466.1-11M4716) Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-466.1, mixed mode) shenrhMacBook:~ shenrh$ java7 shenrhMacBook:~ shenrh$...

  • Android使用SVG

    Android5.0后系统开始支持svg的解析,之前系统就需要使用兼容包 在线转换地址工具 http://inloop.github.io/svg2android/ svg转换成Android可用svg 该转换工具对应5.0以下兼容库vector-compat 教程http://www.w3schools.com/svg/svg_path.asp 按照Android m尺寸出svg,可以在之前布局的时候没有指定具体大小的情况下直接适配。如果代码里面都明确指定了图片view的大小,任意尺寸svg都行。 和普通SVG图内容不同地方在与viewBox那变成了viewportWidth,viewportHeight,viewport就相当于画这个SVG的画布大小。width和height是规定这个SVG图像最终的显示大小的,一般用dp表示。第二个不同是有一个普通SVG里的fill到android里要变成fillColor,这里就是SVG图像填充的颜色。第三点不同是,普通SVG的path的数据是d开头的标签,在android里要写成pathData。综上所述,只要把viewBox的大小改成viewport的大小,把填充颜色的fill改成fillColor,把Path中的d,改成pathData就行了。 还有最后一个问题pathData中的数字是在viewport中的坐标点,M代表move to(把画笔移动到),L是Line(划线),Z是封闭path. svg文件内容 转换为Android可以识别的xml 这里有两个问题需要注意 1、其中多余的app:vc_fillColor和app:vc_pathData都是对原数据的copy,为的是在5.0以下的Android系统提供svg的解析,此方案会造成svg体积变大。可以把color和data分别放到values的svg_color.xml的svg_string.xml里面,通过key引用 svg_color.xml <?xml version="1.0" encoding="utf-8"?> <resources> <color name="svg_fillColor">#929292</color> </resources> svg_string.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="svg_pathData">。。。。。。。</string> </resources> svg.xml文件数据部分如下 <path android:fillColor="@color/svg_fillColor" app:vc_fillColor="@color/svg_fillColor" android:pathData="@string/svg_pathData" app:vc_pathData="@string/svg_pathData" /> 2、5.0以下需要识别出那个是svg图片,那个是普通图片。针对svg图片需要使用VectorDrawable来解析,这就涉及到识别svg部分,目前就是简单的通过文件名的某些特殊标识来识别,但是如果更改文件名会造成需要修改原来资源使用的位置。简单的方案就是这个特殊标识加到后缀上,仿造系统的.9.png的格式,可以用.svg.xml的格式,这样就不需要更改原来代码的使用名称。

  • Java基础知识

    一、Java Exception体系 二、Java Reference体系 三、泛型(generics)简介 四、Executors java线程池 五、类加载器ClassLoader 六、序列化(Serialization) 一、Java Exception体系 Java Exception体系继承关系如下 通常来讲,Java中的异常会被分为三种: Error: 这种异常被设计成不被捕获,因为这种异常产生于JVM自身。 Runtime Exception: 运行时异常往往与环境有关,编译时无法检查,并且可能发生的情况太广泛,所以系统会去处理,程序不需要捕获。 普通异常: 非运行时异常。 这里的Java异常指直接继承java.lang.Throwable的异常类: 普通的Exception必须被捕获,RuntimeException则不用 package com.test; public class Test { public static void main(String[] args) { test(); } public static void test() { throwError(); // 运行时阻断程序 throwRuntimeException(); // 运行时阻断程序 throwsRuntimeException(); //...