- 博客(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关注的人