- 博客(33)
- 收藏
- 关注
原创 装饰者模式
介绍装饰者模式,结构型设计模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方式,且更为灵活。类图Android源码中的模式实现Context类在Android中被称作“上帝对象”,它本质上是一个抽象类,其在我们装饰者模式中就相当于抽象组件,而在内部定义了大量的抽象方法,比如startActivity方法。public abstract clas...
2019-02-02 14:47:35
394
原创 自定义Gradle插件和AspectJ实战
生成gradle插件步骤create new Module select Android Library 把生成的module(例如:plugin)里面的东西都删除(除了build.gradle,但是要被gradle里面的所有内容删除)在plugin里面新增一个“src”文件夹,往src文件夹新增main文件夹,再往main文件夹新增groovy和resources文件夹。resou...
2018-05-03 09:00:04
2590
原创 AspectJ入门
AspectJ的作用:在不侵入原有代码的基础上,增加新的代码AspectJ之Join PointsJoin Points,简称JPoints,是AspectJ的核心思想之一,它就像一把刀,把程序的整个执行过程切成了一段段不同的部分。例如,构造方法调用、调用方法、方法执行、异常等等,这些都是Join Points,实际上,也就是你想把新的代码插在程序的哪个地方,是插在构造方法中,...
2018-05-03 08:54:48
570
原创 MVP封装
穷人版MVP结构图M <–> P <–> M内存泄漏若M层还在请求数据的时候,Activity或Fragment关闭了,由于V层持有P层的引用,P层又持有M层的引用,从而导致了内存泄漏。如果请求到的数据是在展现在View上的,那么还有空指针异常。解决方案一: 让presenter绑定Activity的生命周期,让它写一个绑定和解绑的方法,在Activit...
2018-04-27 16:57:38
356
原创 RxJava线程切换原理
这篇文章跟上一篇的RxJava执行流程有关联性,没阅读上一篇的先瞅一下。怎么进行线程切换的subscribeOn(Schedulers.io())首先了解下Scheduler.io()方法,它返回的是一个Scheduler,Scheduler是一个抽象方法,我们知道抽象方法是不能被实例化的,那么返回的肯定是它的实现类: public static Scheduler i...
2018-04-27 08:46:26
1345
原创 RxJava执行流程
核心问题: - 为甚是被观察者订阅观察者 - RxJava执行的流程为甚是被观察者订阅观察者Observable.subscribe(Observer); 从字面上的理解是被观察者订阅观察者,比如报纸订阅了读者。但从开发者的角度来理解,就很正常 了。RxJava这样设置的目的是为了流式Api的设计,还有就是Android中的观察者模式都是这样的写法,比如Vie...
2018-04-26 17:01:29
1636
原创 github上传时出现error: src refspec master does not match any解决办法
大前提:你已经安装好了git1、在github上创建项目2、clone到本地 :git clone https://github.com/xxxxxxx/yyy.git3、把项目粘贴到yyy目录(git帮你创建好的目录)4、git add . (将改动添加到暂存区,过程中需要那你填写你github的信息)5、git commit -m “提交说明”6、git push
2018-02-06 21:45:49
897
原创 Builder模式
Builder模式主要用于复杂对象的构造,通过使用Builder模式可以减少构造器或方法调用传入的参数数量。这对有很多个配置参数进行初始化的对象来说尤其适用。
2018-01-04 17:00:06
258
原创 RxLifecycle源码学习
使用RxJava引起的内存泄漏RxJava很好用,但是随着订阅的增多内存开销也会随之增大,尤其是在配合使用网络请求的时候,当页面被finish,此时订阅逻辑还未完成,如果没有及时取消订阅,就会导致Activity/Fragment无法被回收,从而引发内存泄漏
2017-08-03 18:29:50
689
原创 LeakCanary源码学习
OOM是开发中很常见的一个异常,其凶手就是内存泄漏。square公司为我们开源了一个神兵利器——LeakCanary,在开发中为我们提供了很大的方便,让我们能够及时发现和处理代码中的内存泄漏问题。作为一个程序员,本着知其然及只其所以然的态度,就很有必要学习下这款开源框架的思想
2017-07-31 22:33:08
991
原创 面试题:两个Activity之间如何传递参数?
在Android应用中,Activity占有极其重要的地位,Activity间的跳转更是加常便饭。即然跳转(界面切换)不可避免,那么在两个Activity之间传递参数就是一个常见的需求。大多数时候,我们也就传递一些简单的int,String类型的数据,实际中也有看到传递List和Bitmap的。那么我们先回答这个题,如何传递参数:使用Intent的Bundle协带参数,就是我们常用的Intent.p
2017-07-12 17:43:59
945
转载 最易懂的自定义View原理系列(1)
转自这里前言自定义View原理是Android开发者必须了解的基础;在了解自定义View之前,你需要有一定的知识储备;本文将全面解析关于自定义View中的所有知识基础。
2017-06-21 16:10:23
326
转载 WebView性能优化
页面加载速度优化影响页面加载速度的因素有非常多,我们在对 WebView 加载一个网页的过程进行调试发现,每次加载的过程中都会有较多的网络请求,除了 web 页面自身的 URL 请求,还会有 web 页面外部引用的JS、CSS、字体、图片等等都是个独立的 http 请求。这些请求都是串行的,这些请求加上浏览器的解析、渲染时间就会导致 WebView 整体加载时间变长,消耗的流量也对应的真多。接下来我
2017-06-18 22:17:35
563
原创 RxJava1.x从入门到放弃再到RxJava 2.x(四)
Zip通过一个函数将多个Observable发送的事件结合到一起,然后发送这些组合到一起的事件. 它按照严格的顺序应用这个函数。它只发射与发射数据项最少的那个Observable一样多的数据
2017-05-21 22:44:22
358
原创 在Android Studio上魅族手机、华为手机无法打印Log
今天突然遇到这两台国产神机集体抽风,让我一度怀疑人生(重装Android Studio,重配Gradle等等,折腾了半天)。最后在同事的帮助下在度娘找到了解决方案。在此记录下解决的过程,方便以后查阅。
2017-05-19 16:19:29
469
原创 RxJava1.x从入门到放弃再到RxJava 2.x(三)
概述RxJava提供了对事件顺序进行变换的支持,这是它的核心功能之一。本节主要学习map()和flatMap()这两个操作符。
2017-05-07 22:15:29
439
转载 Serializable和Parcelable的区别
1、作用Serializable是一种标记接口,作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢(使用反射),为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在。
2017-05-05 23:58:16
604
原创 RxJava1.x从入门到放弃再到RxJava 2.x(二)
前言RxJava1.x从入门到放弃再到RxJava 2.x(一) 这篇文章讲解了最简单的入门,本节我们将会一起学习RxJava的线程调度。
2017-04-23 12:08:34
553
原创 greenDAO 报错: UNIQUE constraint fail(code 1555)的解决方法纪实
这个报错说的是insert的时候id出现重复。
2017-04-22 23:35:15
3706
原创 RxJava1.x从入门到放弃再到RxJava 2.x(一)
从2016.3出来实习的时候,就听到这个流行的框架,那时候偶尔看看博客的介绍,没深入学习与使用,故而什么也没学到。如今借助公司项目重构这个机会,在框架上使用到了RxJava。所以,算是一个再学习的机会吧。由于RxJava2.0已经发布了大半年了,我们就直接学习RxJava 2.0啦,go ,go ,go。
2017-04-19 23:30:41
643
原创 Butterknife源码学习
Butterknife是一个android视图快速注入库,在项目中使用得挺多的,也很方便。至于它是怎么实现的呢?一起来学习下吧。
2017-04-18 23:12:46
629
原创 Android Studio多渠道打包
1、 假设我需要分2个渠道:一个是国内的应用市场,一个是google play的, 需要 在app module下的build.gradle里添加如下代码:android { ... productFlavors { cooby {} google {} productFlavors.all { flavor ->
2017-04-16 15:15:54
369
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人