- 博客(262)
- 资源 (14)
- 收藏
- 关注
原创 LeakCanary2的免写 初始化代码 原理
最近LeakCanary做了升级,发布了2.0版本,带了了很多性能上的优化,不过一个很吸引我的点在于,他居然不像以前一样,需要手动初始化了。按照以前的使用流程,一般我们都是在dependencies 加入依赖dependencies { debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.3' rele...
2019-05-01 22:15:24 3790 2
原创 全局控制依赖的版本号
随着开发项目变大,我们经常会有几十个module,里面有各自的build.gradle文件,各种编译的sdk,库版本等配置。目前搜到的都是类似下面的方案,每个build.gradle都要改,累不累?最重要是这个玩意别的地方改了,你不知道。。。android { compileSdkVersion rootProject.ext.compileSdkVersion defaul...
2018-12-19 19:13:47 1375
原创 访问我的github博客sanjay-f.github.io
由于csdn的不稳定,丢失过我不少文章,所以从1月份开始就停用csdn开始在github上建博客,欢迎关注和访问:http://sanjay-f.github.io/
2016-10-26 15:07:20 1370 1
原创 设计模式系列20---聊聊IoC与中介者
有一个叫控制反转(Inversion of Control,缩写IoC ) 的东西 ,这个对于计算机的人应该是不陌生的概念,就算你不知道那个Bob大叔。这个概念简单说的是下面这样的事情原本各个类之间的关系乱七八糟的,看起来头都晕了。 他们就像齿轮一样,相互咬合依赖。 如果有一个出问题,那可能整个就崩溃了。但是,如果有一个人出来承担大事,负责协调各个类的话! 那么,他们的关系就可以是像下面图片这
2016-01-06 15:05:44 1693
原创 设计模式系列19---可复原的备忘模式
玩游戏我们都知道有个东西叫自动存档,在我们遇到大Boss要打的时候,更是如此,一定要存档! 如果没有存档,死了就要你重新开始,如果是些大型游戏,已经花费了你很多时间,遇到大Boss,然后你被打死了,又没有存档,估计你就想直接把这个游戏卸载了。有时偷懒,还去下载别人的通关档案回来覆盖本地的。 哈,我就曾经做过!还有一些已经刷满无限金币等的存档! 曾经还遇到过必须被大Boss打死才能继续的剧情,但
2016-01-05 13:41:29 699
原创 设计模式系列18---有状态的状态模式
今天我们来聊聊个红绿灯,我们知道有个口诀叫: 红灯停 绿灯行 黄灯亮了等一等但这不是我们关注的重点,我们关注的点是我们红绿灯的状态!一般是 绿灯 -> 黄灯-> 红灯 的顺序。 绿灯能且只能跑到黄灯 黄灯能且只能跑到红灯 红灯能且只能跑到绿灯不过曾经深圳尝试改革,直接从绿灯跳成了红灯,消失一出,当时一片哗然,在试行了一段时间后,发现不妥就又恢复了。所以现在我们
2016-01-05 13:40:47 1057
原创 设计模式系列17---深入了解的访问者模式设计模式系列17---深入了解的访问者模式
我们有巡视组,他的主要工作就是巡视各个地方的一些重要点,看下他们的工作展开情况,整个巡视过程对重点对象深入的调查,如调阅、复制有关文件、档案、会议记录等资料;以适当方式对被巡视地区、单位的下属单位或者部门进行走访调研;听取被巡视地区、单位党委(党组)的工作汇报和有关部门的专题汇报;除了上面的,还有别的很多内容,所以我们的巡视组可以对被调查对象有深入的了解,如果有猫腻也可以很快的被发现。那么问
2016-01-05 13:40:04 793
原创 设计模式系列16---响应请求的责任链模式
所谓责任落实到位,落实到人,就是要找对特定事情有处理权限的人。我们以法院为例子,小事情就在基层人民法院处理了,大一点的事情就找地市级的中级法院,如果事情闹大的就省级的高级人民法院,如果这事件特别重大,那就是最高人民法院了。所以我们看下四个级别: 最高人民法院 > 高级人民法院 > 中级人民法院 > 基层人民法院那么问题来了,当年窦娥冤情换成现在是归谁管呢?可以跳级跑去告御状吗? 代码实现现在我
2016-01-04 17:16:44 832
原创 设计模式系列15---构表分离的建造者模型
现在来讲一件很有意思的故事,上面的画很纯洁,只有一种蓝色。但不得不说这图片还是有色差,不能很好的还原实际的色彩,如果有你机会,可以去看下他的IKB色彩是多么的蓝。 这种蓝被叫做国际克莱因蓝(international klein blue,缩写IKB),以伊夫·克莱因(Yves Klein)的名字来命名的。这一种独特的天青石蓝色是在他的化学家友人EdouardAdam的帮助下合成的。 克莱因相信
2016-01-04 17:15:50 823
原创 设计模式系列14---管流程不管细节的模板方法模式
写了这么久,花的时间最多的是在选故事,找图上,写一篇能看的文章真的不容易啊。 今天来介绍一款“高端智能”的机器人—炒菜机器侠。 一个可以会帮我们炒菜的机器人,懒人必备,价格不要你的2999,不要1999,只要899! 心动了嘛?赶紧拿起手头的手机,扫码购买吧!我们的炒菜机器人,只要你给他材料,就可以煮出你想要的菜。什么扬州炒饭,潮州炒饭都不是问题!好了,上面是一个引入的介绍,我们来看下实际的内
2016-01-04 01:00:24 940
原创 设计模式系列13---感知变化的观察者模型
电影《模仿游戏》中,讲述了我们的计算机科学之父图灵通过制造背后那个大机器,来协助盟军破译德国密码系统“英格玛”,从而扭转二战战局的经历。如果没图灵用这大机器来破译情报,知道敌军动向,估计整个二战战局可能都被改写! 尽管历史没假设,事实就是事实。今天我们要说的观察者就是这样的功效,他监视着被观察者,一有什么风吹草动就打报告。代码实现有了上面这个故事背景,我们该来怎么模拟这个过程呢?先来看下我们图灵哥
2016-01-03 23:19:55 837
原创 设计模式系列12---遍历统一的迭代模式
对于迭代这件事,我们曾经遇到过很多类似的事情,例如:上课点名!!!每次我们的课室存储了一堆的学生对象,然后老师开始迭代名单–点名, 判断某学生是否来上课了,没来的平时分给你扣点,积少成多,考试就压力大了。大学时代满满的回忆啊。代码实现看了这么一个简单的案例故事,我们该怎么用代码实现呢? 首先我们来定义下我们的课室,我们的课室储存了很多的学生小朋友。public class ClassRoom<
2016-01-03 21:26:09 637
原创 设计模式系列11---快速拷贝的原型模型
早年一直有新闻报道,XXX拖欠农民工工资的情况,甚至没有和员工签订合同的。这种做法当然不好,但现实也是挺残酷的,上门为了利润,就这么做,能省就省,遇到什么工伤之类的都不用赔,因为没有合同,你怎么说工伤呢? 这和大公司开一家小公司,去做特定的项目类似,规避风险。假设我们有一份 重要的合同,需要一式两份保存,每人个一份。 这时候我们要快速的备份一份,因为内容完全一样,这时候就可以用原型模型代码实现我
2016-01-03 00:51:22 962
原创 设计模式系列10---高度定制的抽象工厂方法模式
上一篇我们介绍了关于使用公模做手机的事情,但有个问题就是不能高度定制,现在我们来介绍下我的抽象工厂方法,他可以做到的定制就很高啦,既可以造飞机,汽车,又可以做苹果手机等等。一般能处理这类问题的,都是些大厂家,这类大厂家就很规范,分工明确的,而且也有很多流水线,代工不少产品,为了降低风险同时提营业额嘛,好懂。假设有一家叫 NiuBi 的公司,他很厉害,有多条流水线,一条生产火箭,一条生产苹果机,一条生
2016-01-02 18:09:01 672
原创 设计模式系列9---和而不同的工厂方法模式
现在的手机制造业,在高度的繁荣发展后,流水线的工作基础,吸引了很多厂商为了压低成本,搞一些odm的手机,就是在一个模版的基础上,改下壳,换个商标的样子,就开发布会,说有新的手机!大家快带上你的钱来买,卖得好不好,纯靠营销能力啊。例如下面的,某情怀和某米的手机,是不是很一样啊? 改一改又是一部手机! 那么,作为工厂,应该怎么搞呢?代码实现我们设计出这个工厂的基本方法 public class Pho
2016-01-02 13:45:47 620
原创 设计模式系列8---发号施令的命令模式
好了,我们还是开一个故事吧。 我们看到过这样的一个表情,我们的程序员接收到来自四面八方的需求,要和不同的人打交道,应对各种所谓需求背后还加多句:“领导提出来的,恨重要“之类的结束语,最终过载,导致崩溃跳楼的情况。哈哈 最重要的是,我们的美工同学也有这样的经历吧! 这种混乱的需求来源,导致了下面这种情况。所以,与其让整体暴漏在问题前,不如推我们的PM出去面对所有 正所谓集体阵亡,不如一个好。就
2016-01-02 12:08:34 828
原创 设计模式系列7---金点子多多的策略模式
编这个策略模式的故事真的不好想,他和前面的桥接模式很类似,虽然桥接是结构模式,而策略是行为模式。这次的故事真的不容易编啊,我们来看下一个我们变成遇到的情况吧。 public class SortHelper{ public static final int SORT_HEAP=0; public static final int SORT_BIN=1; public stati
2016-01-02 00:51:28 613
原创 设计模式系列5---多变灵活的桥接
title: 设计模式系列5—多变灵活的桥接 date: 2015-12-31 23:26 tags: [android,设计模式,pattern,桥接] categories: android 《桥接》 — SanjayF 小时候,梦想是当一名宇航员,驾驭飞船,太空探索。 长大后,梦想是当一名渔船夫,划着扁舟,荡漾湖面。 后来啊,梦想是当一
2015-12-31 20:44:19 631
原创 设计模式系列4---对外包办的门面模型
说到门面这个词, 在我国的文化就很有内涵啦! 不过Facade 这个词有时候翻译为外观。 到底该怎么理解这个门面模型呢?我们可以看一个公司的架构 董事长同他的总经理说他要把今年的销售额翻30倍吧。总经理听了脸都青了,但没办法,还是得干活,说行,然后就把指标发下去了,让下面的干活去。即把实际做的事情分割给不同部门,然后自己又在办公室继续玩电脑了。这样对于发号施令的董事长,不需要知道具体的细节,只需
2015-12-31 16:04:41 575
原创 源码探索系列16---初篇结尾---那个被RecyclerView替代的Listview
作为这源码探索系列的初篇的终结,选择Listview来做最后一个探索的对象好像也挺好的。 所以我们就来简单的看下我们曾经最熟悉的Listview是怎么去绘制我们的各个View,如何复用的View。起航API:23我们的Listview是继承于AbsListView 的public class ListView extends AbsListView 而这个AbsListView里面帮我们做了大量
2015-12-31 00:27:50 650
原创 设计模式系列3---搞转换的适配器模型
用过苹果手机的人对这两样东西应该很熟悉 我们常常需要买多左边那个适配器来用,要不然以苹果这插头,没几个排插能插上的。 但有了这转换器的话,只要满足两端标准,就可以循环利用,很”环保”.例如这样: — 或者这个: 想当年的巴别塔,如果有这样的做语言转换的翻译人,估计也建好了把。起航说这个转换器和排插,是因为今天要讲的适配器模型就和这个类似的道理 。 就让我们来举个例子看下怎么写适配器
2015-12-30 21:26:30 610
原创 设计模式系列1---独当一面的单例
在开始写之前我想吐槽下CSDN! 源码探索系列6和14居然不见了,上次找版主去找回一次别的文章!这次居然跑了两篇,服务器要高可用啊! 现在还记得14写的内容是HandleThread,但第六篇那么久那里还记得写的是哪篇,想补都补不回来了!我很怀疑这CSDN的人自己都不用这个来写文章的,写文章过程遇到一堆bug也没改进下! 整个CSDN的博客产品线一点真的都不用户友好,设计逻辑上一堆乱起八糟的
2015-12-30 00:24:01 671
原创 源码探索系列15---那个AsyncTask里面的FutureTask
很久前在写源码探索系类2–AsyncTask时候有提及到这个类,现在在这里把FutureTask,Future和Callback,这三个火枪手的关系温习下 起航就让我们进入主题,开始说说这个FutureTask吧。在安装开发过程中,系统限制我们对于耗时的任务是不能执行在主线程的,必须单独开一个线程去做。 所以我们在开发过程的一种写法是下面这样1. 用Runnable new Thread(n
2015-12-29 18:38:10 580
原创 源码探索系列13---Window的PhoneWindow与WindowManager
关于Window,PhoneWindow和WindowManager三者的关系是: Window是一个抽象类,他的具体实现是PhoneWindow 我们通过WindowManager来管理Window。我们的所有的界面,例如Activity,Toast,Dialog等都是靠Window来呈现,因此他是View的管理者咯。很久前用过他的一个功能就是拿来做消息提醒,当有用户发来特定消息时候,
2015-12-28 17:35:42 2174
原创 源码探索系列12---关于事件分发机制
关于View的事件分发,实质就是关于MotionEvent时间的分发 再简单点说就是通过一堆判断,最后决定这个MotionEvent给谁用的问题。三巨头 分发过程中有主要涉及到三个人: dispatchTouchEvent(),onInterceptTouchEvent(),onTouchEvent() 这三者的关系如下 public boolean dispatchTouchEvent(
2015-12-27 19:15:53 557
原创 源码探索系列11---关于View的绘制
我们开发过程,基本需要自定义View,画一些自己的小插件出来 这需要我们掌握整个View的绘画过程和一些别的小技巧。 这里总结下整个View的源码中涉及到的一些绘制过程的核心部分, 之后再来看下整体的内容,毕竟整个源码有近2W1行,不是随便一时半会能搞定的,还是得下不少功夫。起航 —— 绘制流程API:23一般View的“生命周期”即绘画的流程像下面这样。Created with Raphaë
2015-12-27 15:00:21 558
原创 开源系列1---造个图片选择器
打算开个开源系列,用来分享在项目过程中些的一些小轮子。 在这年的末尾,挤下时间,看能改几个还勉强过得去的出来分享给大家。 能力有些,实现得不算很优雅。 还望各大神指点。我要造轮子作为一名爱折腾人员,重复造轮子这种事还是常做的。 没办法啊,做的过程才能发现问题嘛!最少我在做的过程就遇到啦! 例如阴影效果,图片如何压缩显示的问题(蹩脚的写了一个ImageLoader实在不怎样,改用Fresc
2015-12-25 11:41:12 1797
原创 源码探索系列10---替代Listview的RecycleView
自从有了Recycleview,很多原本是我们的Listview业务都被替代了,关于两者的简单比较,可以看这篇文章。我们今天就去看看他背后故事,下次再写Listview,这名征战多年的老将。一些不要搞懂的问题为何谷歌推荐用这个,背后的效率是高在哪里?LayoutManager是怎么去弄不同布局的起航API:23 ,这RecyclerView有一万多行,看起来真的亚历山大啊。我们常用的方式就是下
2015-12-23 23:41:31 893
原创 源码探索系列9---四大金刚之ContentProvider
好了,终于到了最后一个啦,写到这里,真的觉得不容意啊,以前看这些组件也就那样了,现在还要记录下来,重点是这东西都被分析烂了,我们这些后人屌丝还在写,没点突破的。真没意思呢!就当写作业咯。啦啦啦啦,不管如何,让我们开始看下吧起航 — ContentResolverAPI: 23说真的,这个组件我还真的相对于Activity和Service用起来真的好少啊! 现在都不能记起来用他来干嘛了,虽然知道他能
2015-12-19 00:42:51 794
原创 源码探索系列8---IntentService
我们知道,我们的Service如果要执行一些耗时的操作,需要开单独的线程去干活,而IntentService却不用, 在他的onHandleIntent函数里面我们可以执行耗时操作,啊,到底神奇在哪里了呢? 让我们去看看他的源码,背后到底做了什么好事情!起航 — IntentServiceAPI:23public abstract class IntentService extends Serv
2015-12-18 14:51:58 455
原创 源码探索系列7---四大金刚之Service
今天我们来看下这安卓的四大组件的另外一个Service,按套路应该先列点我们在探索过程需要注意的问题,不过现在一时没想到有什么,让我们边看说解释,看下有什么需要注意的起航——开启服务API : 23我们启动服务一般有两种调用StartService和BindService,这里我们先从StartService开始。 首先去到ContextWrapper里面的startService函数@Overr
2015-12-18 12:57:09 617
原创 源码探索系列5---关于Broadcast、LocalBroadcastManager 、EventBus的比较和源码解析
1. 比较性能 对比 : EventBus不差 EventBus ~ LocalBroadCast > Bradocast 运行的线程环境: EventBus完胜!LocalBroadcastManager 所有调用都是在主线程, EventBus 可以定义在调用线程、主线程、后台线程、异步。代码量比较: EventBus完胜!Bradocast @Override
2015-12-17 16:05:14 2104
原创 源码探索系列4---数据库ORM框架之Ormlite解析
在做项目时候,有使用Ormlite来做数据库部分,以提高开发速度。 OrmLite - Lightweight Object Relational Mapping (ORM) Java Package这个ORM框架在一般数据量不大的情况下,是一个很好的工具,他封装得很好,使用起来也很方便! 相比于原始的Sqlite来说,使用后,很容易回不去了, 因为你不再需要敲一堆的sql语句,担心那个字
2015-12-16 15:30:23 1152
原创 关于常量,枚举和注解
我们在开发时候,难免需要定义一些常量,例如我们定义用户的性别的时候,会有男和女,类似下面的public class User { public static final int GENDER_MALE=0; public static final int GENDER_FEMALE=1; int gender; public int getGend
2015-12-16 11:05:26 2757
原创 源码探索系列3---四大金刚之Activity的启动过程完全解析
在不同版本API,底层实现有些不一样,所以这里贴出现在在看的API版本号 API: 23关于Activity的四个启动flag,这里下次再说。 先说下我们熟悉的一句吧startActivity(new Intent(this,Test2Activity.class));相信我们对这句太熟悉不过了,不过说到这里,我想说下关于写Intent的一个感觉好的实践 相信你已写腻了一堆这样的intent
2015-12-15 00:32:25 1159
原创 为什么要用AIDL
说到AIDL,每次就配套一个单词就是IPC,到底是怎么一回事,这事得从多进程说起。 有一天,我们写了一个类,类里面有一个静态变量。就像下面这样public class UserBean { public static int userCount=0;}原本的需求是这样的,通过这个User类的一个静态值,来全局共享一些用户信息,提供给A和B显示用,而这A和B是在两个独立的进程中(非线程
2015-12-09 22:33:54 2596
原创 源码探索系列2---深入解析AsyncTask
在解析前,我们先来看下一般我们使用的情况是怎样的 下面写了一个简单的demo,用来做个简单的任务,从1数到100,同时调用publishProgress(i);来更新下进度。 我想用过的人自己直接阅读下面代码没有任何问题。class MyDemoAsyncTask extends AsyncTask<Integer, Integer, String> { private TextV
2015-12-09 18:19:26 700
原创 源码探索系列1---Handler与HandlerLeak的那些事
开始学安卓的时候,我对一些异步操作都是用Handler和AsyncTask的。现在那个Handler被挂上了泄漏的名字! 最近在设计一个功能的时候,像借鉴于handler的设计模式,所以顺便顺便写篇文章记录下。一开始我调用Handler像下面这样,对这种,系统提示会导致泄漏,为人懒惰, 就直接加了这个@SuppressLint("HandlerLeak"),然后忽略掉它。public class
2015-12-08 18:55:55 3151 1
原创 Android测试教程13--模拟服务器MockServer之Moco详细介绍
前面一篇介绍了如何用mockito来测试我们的一些异步任务,例如网络请求时候的异步回调。 现在做进一步的介绍,一个模拟我们的服务器的东东–moco先运行起来请先下载这个文件moco.jar,接着,在我们的桌面新建一个文件data.json,用记事本打开,粘贴下面的东东 ,具体意思后面介绍[{ "request" : { "uri" : "/hello" }, "response" : { "tex
2015-12-07 15:33:24 10492 1
原创 Android测试教程12--模拟读取的文件/数据库
有时我们需要对文件或数据库进行测试,但我们又不想破坏应用程序或设备原有的数据。 此时我们就需要一个Mock来替代他们,这里的Mock不是android.test.mock, 但也是android.test包下面的,RenamingDelegatingContext的类。首个先我们创建一个应用,功能很简单就是读取该应用目录下的一个txt文件内容,并展示到应用的上。public class Main
2015-12-05 16:13:08 1598
MyDemoApplication
2015-11-23
安卓进程间传递对象
2014-07-25
segement XX no define
2013-08-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人