自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 PhoneWindow & Activity

Activity的UI的层次结构 DecorView 是什么? DecorView是ViewTree最顶层的View。 DecorView与PhoneWindow的关系 Activity的UI结构对照 一个简单的Activity:继承自Activity UI结构对照图 Activity的UI 组建

2016-12-28 20:41:03 576

原创 View的绘制

将View添加到WindowManagerService的过程 1 : ActivityThread.handleResumeActivity 从上面可知,WindowManager是通过Activity的getWindowManager获取到的 更进一步,发现WindowManager是在attach的时候被赋值的。 mWindowManager又

2016-12-28 17:40:54 474

原创 Zygote & System Server & app

Zygote: 作用: Zygote负责fork其他的Android进程:所有的应用程序进程 ,SystemServer。 关于Zygote: 是安卓运行的第一个Dalvik虚拟机进程。/System/bin/app_process 是Zygote对应的进程。SystemServer 和 Zygote分属android操作系统不同Davik虚拟机上运行的不同进程。app_p

2016-12-23 17:53:30 1058

原创 ViewStub的实现

一个例子 点击按钮前 点击按钮后 UI布局文件 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:la

2016-12-12 21:17:16 459

原创 Android app 优化

一、内存 避免内存泄漏 内存泄漏的常见情况 不恰当的static引用。 内部类引起的外部类泄漏 内部类AsyncTask、Handler、Runnable持有context对象: 是否可以修改为静态内部类? 在Activity onDestroy的时候,是否可以remove task,remove callback? 是否可以使用Application 的con

2016-12-12 16:30:55 497

原创 对二维数据的一种遍历

代码 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

2016-12-08 11:01:41 401

原创 选择排序

代码 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); }

2016-11-30 16:24:37 252

原创 冒泡排序

代码实现 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

2016-11-30 15:56:48 320

原创 父类的静态方法能否被子类重写

父类的静态方法不能被子类重写 代码 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

2016-11-29 21:42:12 3013

原创 检查单链表中是否有环

单链表判断是否有环 判断原理 用两个指针,从头节点开始遍历,一个指针a每次走1步,一个指针b每次都2步。 如果有环,两个指针相遇前 b位于a后一位时,那么a,b指针下次相遇。b位于a后两位时,那么a,b指针下下次即将相遇。 算法实现 创建链表 public static Node createList(int max) { boolean

2016-11-27 12:42:40 397

原创 四种线程池

newCachedThreadPool用法 代码 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestMain { public static void main(String[] args) { ExecutorServic

2016-11-22 15:11:14 2150

原创 Aidl实现的一个例子

AIDL 与 Messenger的异同 对于跨进程的调用 AIDL返回值是同步的,而Messenger是异步的。Aidl调用service的方法,会等待直到service中的方法执行完毕。 AIDL在Service中会针对每个请求开启新线程来执行客户端的调用。而Messenger会把消息放在主线程的队列里。 AIDL的实现,要注意线程安全的实现 oneway

2016-11-20 18:54:27 3023

原创 工作线程弹toast

创建Handler的线程必须有looper。 public Handler(Callback callback, boolean async) { if (FIND_POTENTIAL_LEAKS) { final Class klass = getClass(); if ((klass.isAnonymousClass

2016-11-19 01:10:19 462

原创 HandlerThread的实现

主要源码 public class HandlerThread extends Thread { Looper mLooper; ...省略代码 @Override public void run() { mTid = Process.myTid(); Looper.prepare(); synch

2016-11-18 23:41:29 584

原创 Service的学习

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

2016-11-18 22:01:38 387

原创 IntentService的实现

简介 简化了启动服务的实现。 对于每个startService请求,均使用工作线程执行任务,且每次处理一个请求。 工作线程会执行onHandleIntent , service会自动stop。 当service启动后,所有的请求都会在同一个工作线程中执行,单同一时间,只有一个请求在执行。 源码 /** * IntentService is a base class f

2016-11-17 20:37:29 407

原创 学习BlockCanary的实现

Android如何获取主线程堆栈信息 Thread.getStackTrace()方法。 如何在其他线程获取主线程引用 : Looper.getMainLooper().getThread(); 如何Cpu使用情况 获取Cpu总数据,来自CpuSampler的doSample方法 @Override protected void doSample()

2016-11-15 00:33:29 1570

原创 简单工厂

类图 代码 Product public interface Product { public void doSomething(); } ProductA public class ProductA implements Product { @Override public void doSomething() { Syste

2016-11-13 15:07:34 302

原创 策略模式

类图 注意 如果在一个系统里面有许多类,它们的区别只在于它们的行为。 使用switch case 或 其他 条件判断语句的地方 一个系统需要动态的在几个算法中选择其一 使用哪个策略是由外部环境决定的 代码实现 Strategy public interface Strategy { public void travelStrate

2016-11-13 13:53:02 335

原创 重构-读书与实践的体验

本文好多知识来源于《重构》 为何重构: 改进设计 易于理解 避免补丁循环 更快的编写新代码 何时重构: 经常,随时 添加功能时 修改bug时 代码review之后 何时不重构: 代码太混乱,不如重写 项目的最后期限 重构原则 小步进行 重构不改变代码的外观行为 重构时清楚自己是在重构,写新代码时,清楚自己在写新代码

2016-11-12 23:54:36 509

原创 Builder模式

Builder模式的UML图 类图 时序图 Builder模式的角色 Director :调用具体的Builder去构建对象 Builder : 抽象接口,规范产品对象的各个组成部分的构建 ConcreteBuilder : 实现builder类抽象接口,建造过程完成后,返回产品 Product : 建造的产品对象 B

2016-11-12 22:54:08 271

原创 单例模式

单例模式的条件 最多只有一个实例实例的生命周期足够长:如果临时使用一次,使用new就可以 单例模式的类图 单例模式的四种实现 饿汉式 public class Singleton1 { private static final Singleton1 sInstance = new Singleton1(); private Singleton1

2016-11-10 16:39:46 255

翻译 Android Dev 进程与线程 学习

进程和线程 进程 概要 当某个应用组件启动且此应用没有运行任何其他组件时,系统会使用单个线程为应用启动新的Linux进程 默认情况,同一应用的所有组件在同一个进程和线程中运行 如果某个应用组件启动,并且该应用已存在进程,则该组件在已经存在的进程中启动,并使用同一个已经存在的进程 开发者可以设置应用的组件在不同的进程中运行 标示进程 如

2016-11-10 15:36:33 379

原创 ComponentCallbacks2

ComponentCallbacks2 相关类图 关于ComponentCallback2 是一个细粒度的内存回收管理回调。Application、Activity、Service、ContentProvider、Fragment实现了ComponentCallback2接口开发者应该实现onTrimMemory(int)方法,细粒度release 内存,参数可以体现不

2016-11-10 01:02:17 2573

原创 Java ThreadLocal 类

一个例子(参考自张孝祥老师的视频) 代码 package com.jue.test_thread_local; import java.util.Random; public class TestMain { private static ThreadLocal tl = new ThreadLocal(); public static void main(String[]

2016-11-08 13:18:59 353

原创 Android Looper 类

Looper类的重要字段 字段汇总 static final ThreadLocal sThreadLocal = new ThreadLocal(); private static Looper sMainLooper; // guarded by Looper.class final MessageQueue mQueue; final Th

2016-11-07 22:56:24 1031

原创 面向对象的原则(Solid + L)

面向对象的原则(Solid + L) 单一职责 SRP : Single Responsibility Principle 类:只代表一种角色接口:只代表一类抽象方法:只做一件事字读:只代表一种含义 开闭原则 OCP : Open Close Principle 功能的添加通过扩展实现,而不是修改代码类修改的唯一原因是因为错误策略

2016-11-07 11:33:45 324

原创 Java基础,外部类能够访问内部类的私有静态字段。

外部类能够访问内部类的私有静态字段。 public class Singleton { private Singleton() { } public static Singleton getInstance() { return SingletonHolder.sInstance; } private static clas

2016-11-07 11:05:57 1386

原创 switch case 语句

switch case 语句 支持 byte, char , int, enum, 1.7及之后开始支持String。 switch case 语句不支持  long public class TestMain { public static void main(String[] args) { byte b = 1; switch(b) { case 1:

2016-10-21 21:52:19 600

原创 Object 与 String细节

== 基本类型== ,表示字面值是否相等 引用类型==,也表示值是否相等,但是表示的 “对象的地址”,也就是左右两侧是否是一个对象。 Java.lang.Object类 当打印引用时,实际上会打印引用所指对象的toString方法。 推荐所有的class都override toString方法。 系统默认返回的 类的全称 + "@" + 地址的16进制表

2016-08-03 17:40:19 301

原创 Groovy学习笔记 一 、搭建

本文参考自Venkat Subramaniam所著《Groovy程序设计》 Groovy是什么 英文本意:优秀的,出色的。 Groovy语言特点: 轻量级限制较少动态面向对象运行在JVM上遵循Java语义通过编译为Java字节码,可以扩充Java Api 和 类库。 部署要求: Java 1.5及更高版本的Java环境。一个单独的Groovy

2016-06-28 16:02:26 396

原创 Java details-java虚拟机的两种线程

在Java虚拟机内部有两种线程: 守护线程 虚拟机自己使用。执行垃圾收集任务的线程。只要有任何非守护线程存在,那么程序也在继续运行。 非守护线程 java程序的初始线程:有main的。普通的java程序:如果main中没有调用其他线程,执行完程序之后就终止了该程序中唯一的非守护线程,导致虚拟机实例退出。

2014-03-14 23:52:06 638

原创 Working Practice-不同前置条件的delay,有可能造成delay时间的叠加

工作有时候是有依赖关系的,就象有向图一样,不同的前置条件的delay,有可能造成delay时间的累加。最近在开发的过程中,UI设计,接口,与其他项目组的协作过程中都有不同程度的delay。最后导致项目后期比较紧张。

2014-03-06 00:13:57 557

原创 Code Fragment-使用disk cache存储图片

可以使用disk cache存储一些图片,这些图片通常有下列特征: 1.经常重复使用, 2.个数比较大。 尤其对于一段时间不会改变的图片,很有价值。这是一种通过空间还换时间的方法(还节省了流量,提高了用户的响应时间)。

2014-03-03 23:41:47 691

原创 Code Fragment-访问大量数据使用接口

请求大量数据的时候,可以请求压缩格式,返回数据传输会更快,但是压缩会有一定的损耗,当数据量比较小时,可能就会受可能会有损耗。

2014-03-02 23:05:02 633

原创 Working Practice-对于有疑问的问题多一点分析

最近的项目存在两个问题,一个不太在意: 问题一:图片下载使用了memory cache和disk cache,但是每次加载都很慢。问题二:退出我开发的模块以后,会有短暂的无响应问题。 关于这两个问题,本已经发现,但是没有在意,后来查明: 退出此模块的时候,会清空memory cache + disk cache。清空memory cache是正常的,但是disk cach

2014-03-02 00:41:01 767

原创 Working Practice-中间方案

对于一些领导提出的有点为难的需求,可以采用中间方案: 完成部分领导要求的按照合乎的需求完成大部分方案。再晓之以理,说服领导。

2014-03-01 00:32:17 567

原创 Working Practice-为意外情况做准备

今天有2件事情,比较意外: 明天要有一个新的小版本提测。(下午老总通知的)下周大版本要提测。 这种两件事完全与以前了解的计划的不符,如果不能抗拒这种问题,那如何减少这种问题的冲击: 必要的事情,提前沟通确定好。开始时保持一种紧张的节奏。需要多人协作的事情,提前规划好。协作的事情,分批给,尽快开发,尽快发现问题。对未能按时交付协作任务的同事,进行跟踪,督促。

2014-02-28 00:39:12 583

原创 Working Practice-把任务通过邮件发给自己

最近发现了一种非常有趣的工作方式: 总结当天的任务,分列成条通过邮件发送给自己。每次想到一个新的任务,添加到邮件。title+1简要概述。每完成一个任务,添加到邮件,title-1发送给自己。

2014-02-25 23:25:42 746

原创 Working Practice-使用官方的实现

今天跟一个team leader一同讨论了创建快捷方式的问题,我的建议是使用较为灵活的方法,来完成功能。但是另一个team leader更期望使用官方提供的方式去创建快捷方式。自己思考后觉得挺有道理。 官方的通常代表一种通用的,合法的调用方式。这种通用的,合法的方式具有普遍适用性,兼容性较好。

2014-02-24 22:39:55 635

空空如也

空空如也

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

TA关注的人

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