自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 EventBus源码解析

前言EventBus是Square公司公司开源的一款通讯组件。他最大的功能就是可以在Activity与Activity、Activity与Fragment中进行消息的通讯传输。而且他的使用比广播要容易,也更轻便,广受好评。使用方式在gradle中添加引用implementation 'org.greenrobot:eventbus:3.0.0'之后在Activity的生命周期onCreate()中添加注册,在onDestroy()中进行注销操作,然后再写一个订阅方法用来接收消息和处理消息即可。

2020-05-26 15:22:57 401

原创 结合源码谈一谈OkHttp解析

前言Okhhtp是square公司出品的一款非常优秀的网络框架。可以说,目前市面上大部分Android开发人员在网络请求事,都在使用这款优秀的框架。下面,我就结合源码来分析下这款网络框架内部的执行原理,做到知其然也之气所以然的目的。使用OkHttp的使用非常的简单,我下面写一个大概的使用方法提供给大家查看。 //创建okhttpclient对象 OkHttpClient okHttpClient = new OkHttpClient.Builder(.

2020-05-25 10:14:04 549 1

原创 谈一谈Android 启动优化的一些理解和方案

前言假如我们去到一家餐厅,叫了半天都没有人过来点菜,那等不了多久就没耐心想走了。对于 App 也是一样的,如果我们打开一个应用半天都打不开,那很快的我们也会失去耐心。启动速度是用户对我们应用的第一体验,用户只有启动我们的应用才能使用我们应用中的功能。就算我们应用内部设计得再精美,其他性能优化地再好,如果打开速度很慢的话,用户对我们应用的第一印象还是很差。你可以追求完美,要...

2020-05-07 16:30:45 1143

原创 用DownLoadManage封装一个App的更新组件(兼容android 6、7、8)

前言android app的更新是我们在平时开发的时候常常需要遇到的问题。通常的情况是我们用第三方的网络加载库去进行地址的下载,然后进行更新。例如okHttp、volley等,都具备了下载的功能。但是我们在用这些第三方库进行下载的时候可能需要做很多之外的处理,比如更新的时候处理进度。写一个notification去提示下载显示,这无疑让我们在编写代码的时候增加了很多不必要的麻烦。其实And...

2018-12-17 16:38:14 543

原创 RxJava2.0(四)谈一谈基础功能源码实现

前言我们在使用RxJava的时候最常用的功能就是写一个被观察者、一个观察者。在被观察者中发射数据,在观察者中接收数据,最后用subscribe将两者给订阅起来实现最基础的功能。例如下面这种: //被观察者 Observable<String> observable = Observable.create(new ObservableOnSubsc...

2018-12-03 15:14:52 145

原创 35岁,程序员过不去的坎?

最近看到华为、阿里和腾讯这些公司都在收紧对外招聘的门槛。有些甚至在传为了应对经济不景气很多地方都停止招聘,只出不进了。之前华为还公开宣称要辞掉35岁以上的技术人员,导致了大批大龄程序员的恐慌和焦虑。现在很多人说做技术是青春饭,很多人都做不过35岁。那么35岁真的是程序员过不去的坎么? 首先,在我看来答案是否定的,现在程序员的职业生命周期已经得到了明显的延长,随着软件行业的不断成熟,程序员将...

2018-11-08 19:42:32 309

原创 动手造轮子——用Builder模式撸一个通用版本的Dialog

前言在Android开发中我们常常需要使用Dialog来处理一些弹窗操作。虽然Android系统本身为我们封装了一个自带的弹窗Dialog,但是由于Android操作系统的不同,导致了每个手机弹窗页面的不同,以至于我们很难用系统的去统一样式。并且UI会觉得系统的弹窗过于丑陋,希望自己来做一个于是我们便需要自己来处理一个Dialog弹窗。今天叫大家利用Builder构造者模式自己来封装一个弹窗D...

2018-11-08 19:37:50 674

原创 快速学习Kotlin(十一)协程

协程是什么?从本质上来讲,协程就是一个轻量级的线程。线程是由系统(语言系统或者操作系统)进行调度的,切换时有着一定的开销。而协程,它的切换由程序自己来控制,无论是 CPU 的消耗还是内存的消耗都大大降低。在协程中某段代码是可以暂停的,这时候可以去转而执行另一段代码;并且在执行完另一段代码之后又可以回来执行当前暂停的代码。这样所有的代码便可以在你的控制之下随心所欲的进行操作。启动协程...

2018-10-27 10:21:19 756

原创 快速学习Kotlin(十)KTX扩展库

KTX扩展库是Google推出的用于Android开发的kotlin扩展库,他的目的就是为了让我们在开发Android的时候更加方便和高效。Android KTX 是什么呢?简单来说,它就是类似于我们开发中常用的 Support Library 这种支持类库,提供一些非常人性化的 APIs 来帮助使用开发人员更简洁、更符合编程习惯地编写 Kotlin 代码。他有一个目标 不向现有的API添加新...

2018-10-26 20:04:53 1671

原创 快速学习Kotlin(九)Kotlin中的特殊符号

反引号(键盘左上角和波浪线在一起的符号) ``在Kotlin中可以用反引号解决关键字冲突的问题,可以强行将一个不合法的字符变为合法。fun `123`(){ println("this is message")}fun main(args: Array<String>) { `123`();}例如,我们在命名一个函数名称的时候其实是不能用数字开头...

2018-10-26 20:03:26 1665

原创 快速学习Kotlin(八)作用域函数

作用域函数是什么?他是Kotlin内置的,可以对数据进行一系列变换的函数。他们与集合的操作符非常相似,但是集合操作符只能用于集合的一些变换,而作用域函数可以作用于所有对象,他可以对所有对象进行一系列的操作。在kotlin中作用域函数总共有五种,run、with、let、apply、also;我们一一来看他们的作用。run var sex:String = "man"; ...

2018-10-26 19:59:57 502

原创 快速学习Kotlin(七)集合与操作符

集合是我们在代码编写时常用的操作数据的方式之一,具有非常重要的作用。在kotlin中也有集合的概念,kotlin中的集合一般有三种:List、Map以及Set三种。而这三种集合每种又可以分为可变集合与不可变集合两种。不可变集合顾名思义,不可变集合就是集合在初始化时已经将元素放入集合当中去,之后只能对集合中的元素进行查看和遍历,不能对其进行添加、修改和删除。 var ...

2018-10-26 19:32:07 520

原创 快速学习Kotlin(六)循环

一想到循环操作,我们第一个想到的就是Java中的for循环的写法: var count:Int; for (coun = 0;count < 10 ; count ++){ }但是需要注意的是,在Kotlin中是没有这种写法操作的,这种写法是不能运行通过的。Kotlin中有许许多多的循环可以供我们大家来选择性使用。下面我逐一来讲解Kotlin中的循环操作...

2018-10-26 19:28:47 1466

原创 快速学习Kotlin(五)解构

在kotlin中所谓的解构就是将一个类对象中的参数拆开来,成为一个一个单独的变量,从而来使用这些单独的变量进行操作。data class Person1(var name:String,var age:Int){}fun function1(){ var person:Person1 = Person1("Mike",20); var (name,age) = pe...

2018-10-26 19:26:56 831

原创 快速学习Kotlin(四)类与对象

Kotlin中的类class Main{}class Main1 : AppCompatActivity(){}class Main2:AppCompatActivity(),View.OnClickListener{ override fun onClick(v: View?) { TODO("not implemented") //To chang...

2018-10-26 19:12:50 266

原创 快速学习Kotlin(三)函数

在Kotlin中没有方法这个概念,转而存在的是函数的概念。函数的声明我们声明一个函数,使用fun关键字来修饰函数。fun print(){ print("this is message");}fun print(str:String){ print("this is message $str");}fun print1(str:String = "hell...

2018-10-26 19:11:33 256

原创 快速学习Kotlin(二)Kotlin与Java的兼容

与Java的互相调用由于Java与Kotlin是100%共通的,所以他们可以进行相互的调用。那么在Kotlin中声明了一个函数,在Java中该如何调用这个函数呢?假设我们在KotlinDemo.kt文件里写一个Kotlin的函数fun getMessage(str:String):String{ return str;}这个时候我们又新建一个Java文件名字叫做Ja...

2018-10-26 19:09:12 1620

原创 快速学习Kotlin(一)基础语法

变量和不可变量在kotlin中我们在声明一个变量的时候,采用var作为修饰符来修饰一个变量,而采用val修饰符来修饰一个不可变量。这里需要注意一点,这是val是被定义为一个叫做不可变量,而不是一个常量,这两者是有区别的。可以把被val修饰的变量比作在Java中的final,这样理解起来会好一些。var number : Int = 20;val str : String = "he...

2018-10-26 19:06:11 295

原创 OkHttp3.0解析(三)——谈谈内部任务分发器dispatcher

前言OkHttp之所以能够高效处理任务的一个很重要原因在于其内部维护了三个任务队列(readyAsyncCalls、runningAsyncCalls、runningSyncCalls)和一个线程池(ThreadPoolExecutor)。这四个东西由内部的任务分发器dispathcer来进行调控处理,从而达到高效处理多任务的效果。线程池的作用不言而喻,他的主要作用在于可以避免我们在使用线...

2018-09-30 17:29:19 947

原创 Android常用库和插件避免重复造轮子(持续更新)

前言整理了一份Android开发中常用的第三方库,我们在开发的时候就不用去自己再写一些功能了,避免重复造轮子带来的浪费。本文只是部分,我未来将持续更新,希望大家喜欢。下拉刷新PullLoadMoreRecyclerView实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性、网格、瀑布流效果演示 https://github.com/WuXiao...

2018-09-28 14:07:04 1627

原创 从一个技术人员角度来谈谈10000小时定律

前言我们都知道格拉德威尔写过一本书叫做《异类》,里面有一个大家都知道的观点叫做10000小时定律。格拉德威尔在书中描述说,任何人的成功都是在一个领域里面深耕了10000小时的结果。前几天,有一个做技术的朋友跟我谈起了这个10000小时定律,他说他现在每天都在努力学习拼命的敲代码,这几年下来自我感觉良好,公司安排的任务都进行尽力去做了,但是最近跳槽却发现自己很难找到工作,这让他开始怀疑这个100...

2018-09-26 20:51:55 1401

原创 Java中的线程详解

前言我们都知道由于主线程是一个线程不安全的线程,如果在里面进行耗时操作很容易造成主线程的阻塞,导致事件停止分发(包括绘制事件)。,所以在里面不能进行耗时操作。因此当我们要进行一些耗时操作,我们必须开启一个线程来执行任务。那么开启线程的方式有几种?县城阻塞的方式有哪几类以及线程池的操作方式是怎么样的。下面来一一说明。创建线程的方式在Java中我们创建线程的方式总共有三种。 一、继...

2018-09-16 15:14:39 237

原创 从无到有开发一款产品的过程与思考

前言在阿里巴巴总部有着这样一句话,改变世界的不是技术,而是技术背后的梦想。不知不觉已经做技术有三年的时间了,这三年间经历了很多次项目的开发上线,以及产品的争论。很多同事都常常说我,你不像一个干技术的,产品让你干什么你就干什么不就好了,最多就是在技术比较难实现时说一句这个需求做不了就得了,为什么老要去和产品关于交互问题争论呐?我常常争辩道,我认为一个技术不能不会敲代码,但是一个好的技术不能只...

2018-09-08 16:15:28 2425

原创 谈一谈Android中的事件分发

Android中的事件分发对很多人来说并不陌生,它可以说是Android的重点难点,也是面试经常会问的基础知识,很多人都搞不太清楚事件分发的过程。今天我们就来谈一谈Android中事件分发的过程原理。 事件什么叫做一个事件?手指按下到抬起的一个过程称之为事件。在Android中把事件定义为,手指按下(DOWN),到手指抬起(UP),中间由零个、一个或者无数个移动(MOVE)连接起来称之...

2018-09-07 11:12:13 1659

原创 OkHttp3.0解析(二)——谈谈内部的缓存策略

前言合理的利用本地的缓存策略,可以有效的减少网络请求时候的网络开销,减少响应的延迟。而在OkHttp3.0中的缓存主要作用在缓存拦截器CacheInterceptor里面。所以现在我们就具体分析下CacheInterceptor中对缓存的具体操作。 CacheInterceptor我们都知道,OkHttp的核心或者说精华部分就是其强大的拦截器功能,几乎你在使用他的时候都是一些拦截器...

2018-09-05 18:04:37 343

原创 OkHttp3.0解析(一) —— 从源码的角度谈谈发起网络请求时做的操作

OkHttp是square公司出品的一款网络加载框架,我们今天从源码的角度来看看,他在我们进行同步和异步请求的时候,内部都具体做了什么操作。使用在使用OkHttp的时候,首先第一步是实例化一个OkHttpClient对象。OkHttpClient okHttpClient = new OkHttpClient();我们来看看他的构造方法。public OkHttpClien...

2018-08-22 14:26:26 376

原创 EventBus(二)从源码角度来谈谈设计原理

前言EventBus是我们常用的第三方框架,主要作用是在各个组件之间进行通信。而且使用起来非常简单,内部原理也并不复杂,如果还不会用的人,可以参考我的这边文章EventBus(一)基础使用。这里对于使用不做说明,我们主要是来看看内部实现方式和原理。 源码解析 eventBus.getDefault()/** Convenience singleton for apps u...

2018-08-21 17:56:00 413

原创 谈谈LruCache算法的底层实现原理及其内部源码

前言我们在对数据进行操作的时候,为了避免流量或者性能的消耗,我们对于一些数据都会进行缓存处理,而对数据的缓存的要点不仅仅只有我们所熟悉的存储缓存和使用缓存,还有删除缓存。对于添加和获取缓存很好理解,那么为什么还要对缓存进行删除呐?原因很简单,因为我们的手机容量是有限的,如果我们拼命的写入缓存,那么终有一天内存会满导致程序奔溃,这显然不是我们想要的结果,于是我们在写入缓存的时候并非无脑写入,而是...

2018-08-20 11:16:38 11348 4

原创 从源码的角度来谈一谈HashMap的内部实现原理

HashMap可以说是我们一个熟悉又陌生的Java中常用的存储数据的API。说他熟悉,是因为我们经常使用他,而说他陌生是因为我们大部分时间是只知道他的使用,而并不知道他内部的原理,但是在面试考察的时候又最喜欢去问这个原理。今天,我就来从源码的角度,谈谈对HashMap的理解。HashMap概述HashMap的底层基于一个数组来进行数据的存储和取出。其继承于Map这个接口来实现,通过put和...

2018-08-19 14:06:59 956

原创 从源码角度谈谈AsyncTask的使用及其原理

从事Android开发的都知道,我们在进行耗时操作的时候是不能在主线程进行的,不然会报ANR异常,因此我们必须开启一个子线程,在线程中处理耗时操作。但是在子线程中我们拿到了耗时操作返回的数据之后需要在UI上展示,但是在子线程又不能对UI进行更新,于是乎在Android内部就有了消息通信机制Handler以及AsyncTask。今天我们来讲讲AsyncTask的使用以及配合他的源码来讲讲他的内部原理...

2018-08-15 14:11:00 1537 1

原创 RxJava使用(三)操作符

Map操作符Map操作符,是将获取到的数据类型进行转换的一个操作符。他可以将具体从网络端或者其他地方获取到的数据,通过自己编写的方法进行转化成任何你需要的数据类型并返回,交给相应的方法去处理。 Observable.create(new ObservableOnSubscribe<String>() { @Override publ...

2018-05-27 17:17:48 237

原创 从源码的角度来谈谈面试常客Handler的内部原理

  前言我们都知道,在进行Android应用开发的时候,主线程(又称为UI线程)不能进行网络请求一类的耗时操作,必须开启一个子线程来处理;但是在子线程里面又不能进行更新UI的操作,更新UI必须在主线程里操作。那么当子线程进行完耗时操作时如何通知主线程更新UI呐?这个时候Handler就孕育而生了。Handler被称之为Android内部消息机制,他的作用是在子线程进行完耗时操作的时...

2018-05-20 19:23:13 1418

原创 IntentService详解

简介Service执行任务的时候,并不是在子线程中执行,而是在主线程中执行,所以我们在Service中不能执行一些耗时操作,避免造成ANR现象。如果非要进行网络请求等耗时操作的话,这里可以使用两种方式进行处理。1.在Service中开启一个子线程,在子线程中进行耗时操作。但是这里需要声明一个事情,可能有人会问,为什么不能在别的组件中开启子线程进行耗时操作?由于Activity可能会被用...

2018-05-05 18:14:12 1561

原创 Service详解

简介:Service为Android的四大组件之一。他与Activity有些类似,都是可以在他们的内部进行一些代码程序的执行操作。但是区别在于,Activity是具有界面,可以有UI界面与用户进行交互,但是Service却是运行在后台的操作,他不具备UI界面,总是静静的在后台运行着。所以,如果某个程序需要呈现某个界面就用Activity,如果不需要进行界面的交互,则用Service。 ...

2018-05-05 18:12:01 1627

原创 EventBus(一)基础使用

 EventBus是什么? EventBus是一个类似于Broadcast,可以在不同组件和不同线程之间进行通信传递数据的一个组件。     为什么要使用EventBus而不是使用Broadcast? EventBus相比较Broadcast线程开销要小的多,并且操作简便快捷。      EventBus具体使用场景 1. ...

2018-04-21 17:43:34 386

原创 RxJava使用(二)线程之间的切换

在开发当中只要不是静态页面,我们都要对后台服务器发起网络请求。总所周知,发起网络请求是一个耗时操作,一般的耗时操作都必须开启一个子线程来进行请求,从网络端拿到数据之后我们要将数据set到各种UI控件中去。但是坑爹的是,在子线程之中我们并不能更新UI,必须在主线程(又称UI线程)进行数据的set,因此我们又必须切换到主线程去做处理。这样一会儿子线程,一会儿主线程的切换处理,非常让人头疼,代码往往...

2018-04-07 15:35:19 3159

原创 RxJava使用(一)基础使用

RxJava是什么?如果非要用一句话来概括的话,那就是RxJava是一个异步操作。RxJava是一个和handler以及AscyTask一样的可以控制线程操作线程的一个异步操作。 既然RxJava和Handler以及AscyTask效果一样,那为什么要使用RxJava而不是干脆直接使用Handler或者AscyTask呐?这个原因有两点。第一,RxJava的操作简洁。这里需...

2018-04-07 14:38:22 299

空空如也

空空如也

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

TA关注的人

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