自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 安卓面试:如何提高Message的优先级?

面试官:如何提高Message的优先级?前言在日常的开发中有的场景需要我们自己的Message尽快被执行,这时候就需要提高Message的处理优先级。想解决这个问题,就需要对MessageQueue的构造有一定的了解,MessageQueue通过一个链表的结构,根据Message的参数when的大小进行排序,将系统以及我们自己发出的所有Message串起来,when的值越小那么此Message在,当Looper需要处理一个Message的时候,就会从链表里找出一个最符合要求的Message并分发处理。基

2021-09-27 20:25:18 498

原创 okhttp各种请求报文你真的懂吗?

Okhttp每天都在用,请求每天都在发,但是客户端用okhttp构建的每一个请求,你知道他的请求报文是什么样的吗?什么是表单提交?什么是媒体提交?表单提交和媒体提交的请求报文有什么不一样的吗?上传文件的请求的报文又是什么样的?如果上传文件的同时又要求携带参数,这时报文是什么样的?其实我们每天都在处理着这些东西,只不过很少有人注意各种各样的请求的背后到底有什么不同。本文将使用Okhttp完成各种平时常见的请求,并对比不同请求的报文,通过这些相信对okhttp会有一个更深的理解。1.请求报文http的请求

2021-03-25 17:08:42 1223

原创 Retrofit源码解析(三)

前两篇介绍了retrofit与okhttp的关系以及retrofit的内部属性组成,这一遍正式开始剖析retrofit发送一个网络请求的全过程。我们使用最简单的方式构建retrofit,没有搭配RxJava2CallAdapterFactory也没有设置GsonConvertFactory,看看最原汁原味的retrofit是如何工作的。一、retrofit构建val retrofit = Retrofit.Builder().baseUrl("http://www.base.com/").build()

2021-02-20 16:51:51 347

原创 Retrofit源码解析(二)

上一篇中大致对比了okhttp和retrofit发送请求的大致流程,了解okhttp的工作流程对掌握retrofit是非常重要的。本篇继续讲解retrofit的内部构成。retrofit使用Builder模式完成构建,通过Builder模式开发者可以配置常用的GsonConvertFactory完成json数据实例化,也可以添加RxJava2CallAdapterFactory进行自定义请求,最终这些额外的配置都被保存在Retrofit的实例当中。下面先来看Retrofit的属性都有哪些:public f

2021-02-07 17:45:53 543

原创 Retrofit源码解析(一)

在介绍retrofit之前,还是要先详细说一下okhttp。retrofit与okhttp的角色关系就像包工头和工人,retrofit就是包工头,okhttp就是工人。当你想盖一栋房子(发送网络请求)的时候,你就要去和包工头协商我要什么样的房子(发送什么样的请求),当最终确定后,包工头就会派工人去进行实际施工(okhttp去完成实际的网络请求),房子竣工后包工头又来告诉你房子盖完了(retrofit的callback请求回调)。先来看用okhttp发送一个模拟的网络请求:val okHttpClient

2021-02-06 16:59:07 305

原创 聊聊kotlin属性拓展和方法拓展(四)

kotlin的属性拓展和方法拓展能够扩展一个类的新功能而无需继承该类或者使用像装饰者这样的设计模式,但是他并不是打破原来类的封闭性和完整性,而是一种语法糖。并且属性拓展和方法拓展在原理上其实是一样的,反编译为Java后可以看到两者都是通过静态方法实现的。只要记住这一点再去理解拓展的很多特性就很容易了。但是实际工作中会遇到类的继承、方法重写、多态等实际问题,当这些问题和拓展糅合在一起的时候,还是值得去学习的。拓展的原理/** * 基础类 */open class Car/** * 拓展方法

2021-01-07 17:54:08 204

原创 聊聊kotlin属性委托源码解析(三)

1. 什么是属性委托属性委托就是在一个类中,生成一个委托对象来保存被委托的属性。委托对象要求:拥有被 operator修饰的 getValue 和 setValue 函数,当获取属性或者为属性赋值的时候,会自动调用委托对象的getValue 和 setValue 函数2. 属性委托转换规则先来自己定义一个属性委托的对象:class Person { var age: Int by AgeDelegate()}class AgeDelegate { private var age

2020-09-03 16:53:07 437

原创 聊聊kotlin之Lambda表达式解析(二)

1.lambda类型解释在kotlin中,lambda可以表示函数类型,也可以表示Java语言声明的函数式接口,但用kotlin语言声明的函数式接口是不能用lambda表示的,kotlin声明的函数式接口和lambda是不能互相转换的。lambda表示函数:val addMethod: (Int, Int) -> Int = { a, b -> a + b}lambda表示java声明的函数式接口:val runnable: Runnable = Runnable { pr

2020-09-01 20:53:57 771

原创 聊聊Kotlin包的概念(一)

1.Kotlin默认导包在kotlin中,我们可以在顶层函数或者类方法中随时随地的使用 let、with、also、apply等作用域方法,也可以随时调用 listOf、mutableListOf 等集合相关的方法,那么这些方法是从哪来的呢?原因就是每一个kotlin文件,都会默认导入很多包。根据官方文档,每一个kotlin文件都会默认导入以下包:kotlin.*kotlin.annotation.*kotlin.collections.*kotlin.comparisons.* (自 1.1 起

2020-09-01 14:39:43 674

原创 手撸一个 aidl

先看一下效果图:源码在这里安卓中跨进程通信是通过Binder。而我们在代码中使用Binder的方式就是定义一个 aidl 文件编译后会自动生成相应的 java 文件。本篇抛开 aidl 文件,动手写一个可以实现跨进程通信的demo。在开始之前先看几个问题:1、aidl接口文件是 java 用于跨进程通信的工具,那如果是在同一个进程中 aidl 还能用吗?2、transact 和 onTra...

2020-01-03 10:42:26 327

原创 安卓view tree构建解析

安卓开发中,最常见的就是在 Activity 的 onCreate 方法中调用 setContentView 后,开始一系列的 findViewById、 setOnClickListener、setText 等等视图相关的操作,在调用 setContentView 方法后整个 Activity 的视图树就形成了,也就是说我们在 xml 布局文件中写的布局都 “转化” 成了我们在代码中可以操作的一...

2019-12-25 19:03:10 630

原创 Scroller源码解析与实践

先来瞅一眼看完本篇后最终要实现的效果:ScrollerTextView。普通的TextView是不具备滑动功能的,当文字的长度超出了TextView的宽高范围后就会被截断,所以我通过Scroller与View的scrollTo、scrollBy方法结合实现了一个可以跟随手指移动,并且带有fling效果的TextView。1. startScroll() 源码解析 public void...

2019-12-06 20:23:12 247

原创 View之requestLayout源码解析

前言在这个方法的源码中,核心的思想用到了 二进制标志位 , 如果你还不知道什么是二进制标志位,墙裂建议先看一下二进制标志位在Java中的应用。先抛出一个问题,如下图所示,当我调用 View1 的 requestLayout 方法时, 图中的 ViewGroup1、View1、ViewGroup2、View2 都会重新测量和布局吗?1、requestLayout源码解析public voi...

2019-11-18 10:03:06 507

原创 二进制状态标志位在Java中的应用

1、二进制为什么是二进制呢?因为计算机在计算的时候全部都是基于二进制计算的。在Java中声明一个普通的int类型变量:private int age = 10;此时的变量 age 是默认十进制的,转化为二进制也就是:1010。如果想要在代码中声明一个十六进制的int类型变量呢?private int age = x10;此时变量age在10的前面加了一个 “x” , 这就是告诉计算机...

2019-11-15 17:59:40 3040

原创 View系列 - MeasureSpec全面解析

前言兵马未动,粮草先行。在View的整个measure过程中,MeasureSpec就是这场战争的后勤补给军,贯穿了整场战争。要想真正理解measure的过程,就必须要百分之百的掌握MeasureSpec!相信很多人在学习MeasureSpec源码的时候,经常会看到这样的东西:private static final int MODE_MASK = 0x3 << MODE_SHI...

2019-11-03 20:33:18 514

原创 安卓注解Annotation基础以及运行时注解剖析(一)

当前最火热的各种安卓框架:ButterKnife、Retrofit、EventBus、GreenDao等全部是使用了安卓注解Annotation技术,可见注解确实是有它独特的优势,知其然而知其所以然,才能在开发中更得心应手!平时总有人会说这么多的框架只要会用就足够了没有必要浪费时间看源码是如何实现的,我想说:请不要为自己的懒惰找借口!!我自己的体会:在看了很多框架源码后,有一种茅塞顿开的感觉,对自己

2017-09-19 16:58:15 639 2

原创 一张图带你彻底理解安卓MVP设计模式原理

首先看一眼项目结构: 然后看一眼MVP原理图: 最后说明下起到衔接作用的OnLoginListener: OnLoginListener: 自定义的网络请求回调接口,在modle层的IBeanImpl中的网络请求回调中,调用自己写的OnLoginListener回调。 然后在Presenter中,调用modle层的请求网络的方法,就可以通过OnLoginListener这个回调拿到请求结果

2017-08-31 09:29:01 821

原创 EventBus3.0最容易理解的源码解析

作为安卓程序员,知其然更要知其所以然,好的工具不应该只停留在会用的层面上,更应该探究其原理,一方面进阶自己,另一方面也是自己在面试中的优势。接下来的源码解析,我不会照搬EventBus的源码进行一行一行解说,那样太晦涩对于新手来说很不友好,我将在我撸了一遍源码的基础上,归纳总结。一、六大参数解析首先,在我们使用EventBus.getdefault( )这句代码时,EventBus会帮我们实例化Ev

2017-08-29 11:37:39 729

原创 VirtualAPK宿主和插件交互解析

VirtualAPK最大的特色在于支持宿主和插件之间的数据交互,在官方文档中也介绍了VirtualAPK数据交互的原理方法,但是我相信还是有很多人对此一头雾水,首先上一张官网的交互教程: 一、数据交互原理官网中提到了aar这个文件,这是安卓特有的一种压缩格式,对于jar文件大家肯定都不陌生,jar文件可以理解为代码的压缩文件,而aar可以理解为代码+res资源的压缩文件。有人看到这个aar肯定第一

2017-08-29 10:48:13 1210

原创 bugly热更新上传补丁失败原因及解决办法

最近这两天一直在研究腾讯的bugly热更新,bugly团队是基于微信的Tinker热更新方案进行的进一步封装,意在简化程序员的集成难度,相信直接集成过微信Tinker的童鞋肯定深有体会!有很多童鞋在集成bugly的时候肯定或多或少都遇到过千辛万苦打好的patch补丁文件最后在上传至Bugly平台的时候却提示出错,如下图:

2017-07-07 10:16:16 6784 2

原创 阿里热更新sophix集成详解

今天集成测试了阿里最新的热更新技术sophix,单单就项目集成来说,阿里这次是真的下了一番苦功,相信集成过微信Tinker热更新的同学一定知道Tinker的集成是有多么的费劲!!!而且sophix采用非侵入打包,图形化的生成补丁,用阿里的原话说就是“傻瓜式接入”,点一点鼠标就能生成补丁文件,而且阿里提供了后台补丁管理系统,帮助开发者在生成补丁后直接上传至阿里的后台,无需开发者在自己的app和服务端

2017-07-05 18:32:23 3452

原创 一个大四实习生从安卓小白到可以独自承担安卓和web前端的一年奋斗之旅

这是一篇无关技术的文章,而是对自己整个大四一年工作经验的总结,记录着自己的学习方法和学习习惯,记录着自己从最开始的一个安卓小白,到现在可以独自承担原生安卓项目。记录着自己在工作之余学习H5前端技术,到现在可以熟练掌握H5前端技术独自完成WebApp混合开发。又到了每年的毕业季,这篇博客是对自己这一年努力的总结,也希望自己的经历可以可以帮助更多的大三、大四正在找工作的努力奋斗的学生。

2017-04-27 11:13:35 7846 54

原创 安卓 集成环信EaseUI导致V4jar包冲突

在集成环信EaseUI时,由于EaseUI本身包含了V4.jar,所以在自己项目中直接导入EaseUI时可能会引起V4包冲突,其实究其原因就是,EaseUI的V4.jar包和你项目本身的v4.jar包版本不一致造成的。网上说了一大堆方法,有的说要在在自己的项目中添加配置,是自己的项目不使用自己V4,而去使用EaseUI的v4,其实最好的办法就是直接将 EaseUI的v4.jar包的版本改成和自

2017-03-23 09:34:34 2069

原创 安卓 WebView 使用小结 避免内存溢出 适合新手

如今安卓APP重大多都用到了WebView+H5混合开发,废话不多说,先来总结下WebView两个重要的类:WebViewClient:类中有很多方法,帮助我们随时监听网页的加载状态1、shouldOverrideUrlLoading(): 网页中所有的加载动作都可以通过这个方法拦截获取2、onPageStarted():加载页面之前调用3、onPageFinished():

2017-03-16 09:14:19 3701

原创 安卓集成微信支付总结 适合新手

官方介绍:1、商户服务器生成支付订单,先调用统一下单API生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付2、在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调o

2017-03-09 09:22:35 555

原创 安卓 监听网络视频播放 卡顿

有两种方式设置视频监听卡:一、系统自带的监听卡对象在视频播放中,如果播放网络视频出现卡顿,需要对卡顿的情况做出处理:监听卡在安卓4.2以后,MediaPlayer.OnInfoListener类用来监听视频的卡顿,并且将监听卡封装在了VideoView中,通过:videoView.setOnInfoListener(new MediaPlayer.OnInfoListene

2017-03-08 09:31:57 2782 1

原创 安卓 JNI fork 监听程序被卸载

C语言中有一个一个函数叫做fork():分叉fork函数的作用:创建一个和现有进程几乎一样的另一个进程,所以叫分叉用途:用于监听APP程序被卸载返回值有三种:0:说明当前进程是子进程(新创建的进程)大于0:说明是父进程小于0:出错安卓中安装一个程序,会在SD卡上创建一个目录来存储APP: data/data/包名为

2017-03-03 16:31:27 571

原创 Picasso 加载图片 缓存小结

Picasso:实现了图片的异步加载 和 缓存功能。而且1、在ListView中,不可见的item会被回收利用导致图片错乱,Picasso已经解决了这个问题,在ViewHolder被重用的时候,他会自动取消上次的加载2、使用复杂的图片压缩转换来尽可能的减少内存消耗3、缓存:自带内存和硬盘二级缓存功能,Picasso内部使用LruCache缓存机制,默认情况下是有缓存功能

2017-03-02 09:05:18 571

原创 RecyclerView解决条目错乱以及图片闪越+三级缓存机制

RecyclerView导致条目错乱的原因:viewHolder的复用,一个复用的ViewHolder他里边的View有些属性已经被修改了,所以新的item在使用服用的viewHolder时,那些被修改的viewHolder里边的属性还依然存在,所以会导致新的item也应用到了原来的viewHolder属性,导致出现错乱解决recyclerView加载图片闪越问题和图片错乱的问题

2017-03-01 12:58:05 3372

原创 安卓捕获运行时异常

安卓异常分为两类:CheckedException 和 UnCheckedExceptionCheckException:在编译代码时就需要进行try()catch捕获的。UnCheckException:所有的运行时异常,RuntimeException类和他的子类,都是在APP运行的过程中的发生的。即:APP在运行的过程中崩溃了,这种异常我们就成为运行时异常(比如空指针),当A

2017-02-27 22:53:10 763

原创 通过自定义.xml文件实现各种效果的SeekBar

最近项目中用到了SeekBar,大家都知道系统给的“SeekBar”只能用一个“丑”字来形容,为了达到项目经理的各种需求,实现各种颜色各种样式的SeekBar我们只能自定义。今天我就通过在Drawable文件夹下定义各种.xml文件来实现好看的SeekBar。废话少说,直接上图 目前我的API版本是24,第一个SeekBar是我自定义的(其实也很丑,为了给大家演示),第二个SeekBar使系统默认

2016-11-05 18:41:10 1726

原创 一分钟教会你解析任何复杂Json字符串:Android Stuoid GsonFormat插件+Gson.jar

最近在做项目的时候,经过高人指点,发现了一个快速解析任何复杂Json字符串的办法,使用完之后当场就惊呆了,我们不生产轮子,我们只是轮子的搬运工。说起Json字符串的解析,不可避免的就是自定义JavaBean,如果我们的Json字符串很简单还好,可以很快的定义出符合标准的JavaBean,但如果我们的字符串是一段非常复杂的Json,这时如果还自定义JavaBean的话就有点low了,下边给大家推荐一个

2016-08-23 16:04:04 1878

原创 安卓使用”百度地图SDK“的技术总结以及“常见错误处理”

由于最近做完了一个项目“停车位助手”是基于百度地图SDK的[我的项目APP开源在这里](github.com/haoxinlei1994),在开发期间使用百度地图的时候遇到了各种奇葩的问题,今天我就对百度地图SDK的使用进行一个总结,对以前经常犯的错误集中起来,希望可以帮助更多的人。如果有错误欢迎各位大牛指正。1. 下载SDK开发包时,一定要将想要实现的功能模块一起打包下载下来。 在使用百度地图之

2016-08-23 15:07:08 1339

原创 安卓自定义控件(View)(二)之接口回调机制实现TopBar的点击事件

在上一篇文章中,我介绍了如何自定义控件的基本三大步骤,上一篇文章麻雀虽小五脏俱全,在大的项目也是从小一点点做起来的,今天我就来说说如何给自定义的控件添加监听事件,并且对代码进行优化。说起安卓接口回调机制,我相信很多人尤其是像我这样的自学者,刚学的时候听起来更是一头雾水,今天我就在上一篇文章的基础上继续讲解(下面所讲纯是我对接口回调的个人理解,可能会很通俗,很适合新手,如有错误欢迎批评改正)

2016-08-09 17:30:50 689

原创 安卓(Android) 自定义控件 导航栏(TopBar)

作为一只安卓自学的小白,今天第一天发表微博还是有点小激动的,好了,废话少说下面开始我的安卓自定义控件知识总结。我的demo是一个自定义的TopBar,左边一个Button按钮,中间是一个标题,右边也是一个Button按钮。在安卓开发中自定义控件的技术是一个项目中不可缺少的一部分,下面我就用我的小demo一步步详细介绍,麻雀虽小五脏俱全,相信看完这篇文章对自定义控件肯定会有一个很好的掌握。首先来看一下

2016-08-07 10:48:14 4179 1

空空如也

空空如也

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

TA关注的人

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