OkHttp源码分析
本文基于OkHttp 4.9.0分析
OkHttp是什么?众所周知,OkHttp是一个客户端用来发送HTTP消息并对服务器的响应做出处理的应用层框架。而且现在流行的Retrofit的底层同样也是基于Okhttp的。那么OkHttp有什么优点呢?我们来看下:
无缝的支持GZIP减少数据流量
缓存响应数据减少重复的网络请求
请求失败自动重试主机的其他ip,自动重定向。
如果 HTTP/2 不可用, 使用连接池复用减少请求延迟。
……
使用方式12345678OkHttpClient client = new OkHttpClient();Request request = new Request.Builder() .url(url) .build();//同步Response response = client.newCall(request).execute();//异步Response response = client.newCall(request).enqueue();
我们可以看到同步和异步是调用Call的execute和enqueue方法,我们来 ...
Android Jetpack导航组件——Navigation的使用
概述Navigation是采用一个Activity和多个Fragment形式设计的Ui架构模式,但是众所周知,Fragment的管理一直是个麻烦事,需要通过FragmentManager和FragmentTransaction来管理Fragment之间的切换。所以Google提供了一套Navigation用来管理Fragment相互间的跳转等逻辑。我们先看下Navigation的优势:
处理 Fragment 事务。
默认情况下,正确处理往返操作。
为动画和转换提供标准化资源。
实现和处理深层链接。
包括导航界面模式(例如抽屉式导航栏和底部导航),用户只需完成极少的额外工作。
Safe Args - 可在目标之间导航和传递数据时提供类型安全的 Gradle 插件。
ViewModel支持 - 您可以将ViewModel的范围限定为导航图,以在图表的目标之间共享与界面相关的数据。
正式介绍前,我们需要了解Navigation是由哪几部分组成的,现在我们看一下:
NavHostFragment:一种特殊的Fragment,用于承载导航内容的容器。
Navigation ...
Android Jetpack架构组件——LiveData原理篇
前言前面我们讲到了LiveData是如何使用的,并在最后留了几个问题。比如它是如何通过生命周期去变化的?为什么DESTORY不会接受数据?postValue和setValue是如何更新数据的?Transformations的map和switchMap方法内部是如何操作的?别急,本篇文章会带你了解其原理。接下来上正文。
LiveData是如何观察生命周期变化的?如何观察生命周期,我们需要通过他的observe方法去看,我们上源码:
1234567891011121314151617181920212223@MainThreadpublic void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) { assertMainThread("observe"); //1 if (owner.getLifecycle().getCurrentState() == DESTROYED) { // ignore ...
Android Jetpack架构组件——LiveData使用篇
概述一般来说,LiveData很少单独使用,它更多的和Android Jetpack的其他组件搭配使用,比如ViewModel和ViewBinding。所以前面我们介绍ViewModel的使用以及其实现原理。那么这篇文章就来介绍LiveData的使用。
LiveData是什么?通过字面意思其实我们可以理解成生存(活着)的数据。我们看下官方是怎么介绍它的:
LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保LiveData仅更新处于活跃生命周期状态的应用组件观察者。
化繁为简:
LiveData具备生命周期的感知能力
LiveData只存在活跃的生命周期里,比如STARTED或RESUMED。
LiveData的优势使用 LiveData 具有以下优势:
确保界面符合数据状态LiveData 遵循观察者模式。当底层数据发生变化时,LiveData会通知Observer对象。您可以整合代码以在这些Observe ...
Android Jetpack架构组件——一文带你了解ViewModel的使用及原理
概述前面我们讲过了lifecycle的使用及原理。今天我们谈谈viewModel。原本使用和原理是准备分开写的,结果我看了下ViewModel的原理,很简单,所以决定把两者放在一起了。那么接下来,我们进入正题。
ViewModel是什么?ViewModel旨在以注重生命周期的方式存储和管理界面相关的数据。我们知道当屏幕旋转时,Activity会销毁并且重建,而它让数据可在发生屏幕旋转等配置更改后继续留存。
哎?那就有人要问了,为什么我们不通过onSaveInstanceState()对数据进行保存,然后在onCreate()的时候读取数据呢?这种方法其实只适合少量的数据,并且它还需要进行序列化操作。不过毕竟Bundle的传输数据是有大小限制的。
还有Activity和Fragment有数据交互的时候,那么我们的成本其实也是相对有点高。而ViewModel便可以替我们解决此类问题。
所以从UI控制器逻辑中分离出View的展示数据所有权的操作更容易且更高效。
ViewModel的生命周期我们先看一张官网的图:
上图说明了Activity经历屏幕旋转而后结束时所处的各种生命周期状态 ...
Android Jetpack架构组件——Lifecycle原理篇
概述前面我们讲到了lifecycle是如何使用的,但是我们单单知道如何使用它还是不够的,我们需要知道它到底是如何绑定生命周期的。那么本篇我们就讲一下lifecycle的原理篇。
本篇基于Android 9.0源码进行分析,如有不同,注意sdk版本。
Lifecycle是什么?官方文档是这么描述的,Lifecycle它是一个类,用来存储相关组件的生命周期状态,如Activity或者Fragment等。并且允许其他组件对这些状态进行观察。
我们先简单看一下Lifecycle这个类的源码:
123456789101112131415161718192021222324252627282930313233343536373839public abstract class Lifecycle { @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) @NonNull AtomicReference<Object> mInternalScopeRef = new AtomicReference<>(); ...
Android Jetpack架构组件——Lifecycle使用篇
概述Lifecycle是一个持有组件生命周期状态的class,并且允许其他组件来观察生命周期的变化。并不局限于Activity或者Fragment。我们只知道生命周期是由操作系统或者进程中运行的代码进行管理。而且生命周期是Android工作原理的核心,所以应用必须遵循它们。否则会引起OOM或者Crash。
为什么需要使用Lifecycle管理生命周期在此我们用官网提供的一个示例:
12345678910111213141516171819202122232425262728293031323334353637 internal class MyLocationListener( private val context: Context, private val callback: (Location) -> Unit) { fun start() { // connect to system location service } fun stop() { // dis ...
Android Jetpack架构组件——什么是Jetpack?
前言提到Android架构,我们首先想到的是MVC,MVP,MVVM。他们主要是针对视图和模型的。随着Android的发展,从原来的框架很少,全是自己动手撸。到现在框架越来越多,选型也越来越多,导致开发出来越来越不规范。我们知道MVP和MVVM只是应用在架构上,而不是在框架选型上。而google在2018年推出jetpack就是为了解决以上的问题。
Jetpack是什么?Jetpack它不是一个新的架构,而是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种Android版本和设备中一致运行的代码,让开发者精力集中编写重要的代码。
Jetpack的优势既然需要使用Jetpack,那么说不出一些优势,你的领导也不会同意说换就换的。下面我们看看jetpack有哪些优势:
Jetpack 拥有基于生命周期感知的能力,可以减少NPE崩溃、内存泄漏。为我们开发出健壮且流畅的程序提供强力保障。
Jetpack 可以减少样板代码,有助于提升 Android 开发的效率。
JetPack的分类我们来看下google官方提供的一张图:由图可知,Jetpack被分成了四大类: ...
Gradle中Transform是什么?
概述Google从 Android Gradle 1.5.0 开始,提供了Transform API。通过Transform API,允许第三方以插件的形式,在Android应用程序打包成dex文件之前的编译过程中操作.class文件。我们只要实现一套Transform,去遍历所有.class文件的所有方法,然后进行修改,再对源文件进行替换,即可以达到插入代码的目的。
Transform可以做什么首先,我们可以先执行一次build操作,命令行会输出如下内容:
1234567891011> Transform core-runtime.aar (androidx.arch.core:core-runtime:2.0.0) with AarTransform> Transform lifecycle-livedata-core.aar (androidx.lifecycle:lifecycle-livedata-core:2.0.0) with AarTransform> Transform lifecycle-livedata.aar (androidx.lifecyc ...
如何自己动手撸一个Gradle插件
前言前面我们已经把gradle中groovy的一些语法,以及常用的project和task介绍了一遍,那么我们通过自己撸个插件。刚好把前面的内容巩固下。
插件的作用首先我们需要了解下插件的作用,主要有如下几点:
添加任务到项目中,可对项目进行测试、编译、打包;
添加依赖到项目中,可用来配置项目构建过程中需要的依赖;
可以向项目中现有的对象类型添加新的扩展属性、方法等,可方便项目的配置和构建优化,比如 Android 项目构建中的 android{} 就是AndroidGradle插件为Project 对象添加的一个扩展。
插件的分类插件主要是分为两种:脚本式插件和二进制式插件。
脚本式插件脚本式插件就类似于前面文章提到的,自己新建一个config.gradle,然后通过
1apply from:"../config.gradle"
去引用config.gradle文件中的一些属性等,如可将某些工具性质的方法以及各个依赖使用的版本号分别定义到单个gradle文件中,方便统一调用和管理各个依赖的版本号等。
二进制式插件二进制插件一般式之通过式Plug ...