自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 Flutter和Dart系列之十三:按两次退出应用

在Android应用中,当用户处于主页时,为防止用户误触返回键退出应用,一般我们都会设置如果两秒或者三秒连续点击两次才被视为主动退出应用。那么在Flutter中,该如何实现该功能呢?这个时候我们就需要借助于WillPopScope这个类,具体实现代码如下: class HomePage ext...

2020-05-03 18:44:10 72 0

原创 窥探JVM(一):类的加载、连接与初始化

我们都知道将java源文件通过javac命令编译后得到的是.class文件,它是真实存储在磁盘上的,那么Java虚拟机是如何将其读入内存,最终形成虚拟机直接使用的Java类型的呢?这一切都要归功于虚拟机类加载机制。 虚拟机类加载机制可以分为如下几个阶段: 加载 连接: 验证 准备 解析 ...

2020-05-02 20:22:35 129 0

原创 Android Architecture Component之:深层次理解ViewModel

上一篇我们从源码层面上分析了LiveData的内部实现,今天我们来走进ViewModel的内心。 回顾如何获取一个ViewModel实例: ViewModelProvider(this, MainViewModelFactory())[MainViewModel::class.java...

2020-04-28 16:29:47 50 0

原创 Android Architecture Component之:深层次理解LiveData

LiveData是Architecture Components中的重要一员,本篇将带领大家从源码层面深层次理解它的机制。(此篇不是零基础讲解LiveData和ViewModel的使用,建议往下看的小伙伴先熟悉LiveData和ViewModel的基本使用) 使用: 首先在build.g...

2020-04-11 15:21:14 274 0

原创 Kotlin学习系列之:inline、noinline和crossinline

inline:我们在之前已经对其做了专题描述,具体可参阅Kotlin学习系列之:inline noinline. 当我们的内联函数中有多个lambda参数时,如果我们想要其中某一个lambda参数不进行内联,则可以使用noinline关键字。 fun main() { m...

2020-03-31 18:12:26 57 0

原创 Kotlin学习系列之:协程上下文与分发器

我们在协程的第一篇就已经提过,协程的运行是依赖于线程的。那么协程与线程之间的关系到底是怎样的呢? 协程上下文(Coroutine Context):多种元素的集合,包括Job、分发器等。协程总是会在某个上下文中执行的,这个上下文是由CoroutineContext类型的一个实例来决定的。 ...

2020-03-22 00:28:45 73 0

原创 Kotlin学习系列之:使用async和await实现协程高效并发

引例: private suspend fun intValue1(): Int { delay(1000) return 1 } private suspend fun intValue2(): Int { delay(2000) return 2 } fun...

2020-03-20 00:33:36 426 0

原创 Kotlin学习系列之:协程的取消和超时

​ 通过前面的三篇文章,我们已经讨论了协程的创建。有的时候,我们在启动了一个协程之后,并不需要该协程执行完毕,这个时候我们可以取消该协程的执行。比如在Android开发中,我们打开了一个页面,我们在进入页面的时候启动了一个协程来发起了网络请求,但是用户立马就关闭了页面,这个时候我们就...

2020-03-19 16:30:58 242 0

原创 Kotlin学习系列之:协程的创建(三)

经过前面两篇的学习,我们现在可以来总结一下,我们可以有哪些方式来启动一个协程: GlobalScope.launch{} runBlocking{} 接下来我们介绍另外的两种方式,我们先直接来看代码: fun main() = runBlocking { // GlobalS...

2020-03-16 20:35:27 51 0

原创 红黑树(Java)学习系列一:二叉排序树

​ 红黑树(Red-Black Tree)是一种非常重要的数据结构,在开发中我们时常能够见到它的身影,如JDK中的TreeMap、TreeSet以及JDK8中的HashMap,在它们的底层实现中都使用到了红黑树。红黑树的学习成本还是挺高的,为了掌握这一数据结构,我们决定从二叉排序树开始讲起,...

2020-03-15 13:25:41 38 0

原创 Flutter和Dart系列十二:动画(Animation)

一个App中如果能有优秀的动画效果,能让App看起来显得更加高大上。此篇我们就来介绍一下Flutter中Animation体系。 我们先来一个简单的例子,来实现透明度渐变动画: class FadeInDemo extends StatefulWidget { @override ...

2020-02-06 13:48:47 133 0

原创 Flutter和Dart系列十一:Function(二)

我们在系列四中已经介绍了Dart中有关Function的基本概念,今天我们来围绕“函数作为一等公民,作为对象”这一概念来展开讨论和总结。 将一个函数赋值给一个变量. add(int a, int b) => a + b; void main() { var sum = ad...

2020-01-10 11:17:17 68 0

原创 使用OkHttp实现WebSocket通信之:断线重连

之前的两篇关于如何使用OkHttp来实现WebSocket通信,然后有很多小伙伴私信问我如何实现断线重连,今天我就把我项目中实现的重连机制代码贴出来: (我的实现思想就是基于斐波那契数列来进行尝试重连) 1. 抽象的接口: interface IRetryStrategy { fu...

2019-11-23 17:58:46 1401 4

原创 Kotlin学习系列之:委托(Delegate)

1. 引入:委托作为一种传统的设计模式,在Java中要想实现这种设计模式,就需要自己进行类的结构设计来实现。而在Kotlin中,提供语言层面上的支持,我们可以通过by关键字很轻松就能实现。 2. 类委托(class delegate) 自己动手实现委托: interface Serv...

2019-08-15 16:28:10 529 0

原创 理解设计模式之:状态模式

1. 定义:当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。 2. 对状态模式的理解:状态模式中的行为是由状态决定的,不同的状态下有不同的行为。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。 3. 状态模式中的角色: Context:环境角色,...

2019-08-13 19:22:34 50 0

原创 Kotlin学习系列之:运算符重载(operator overloading)

1.引入:运算符重载,最初接触到这个概念是在C++里,Java中是没有的,取而代之的是通过特定接口来实现,比如进行排序比较大小时,我们可以实现Comparable接口。而Kotlin中,又重新支持该特性,因为这样会显得更加直观。 2.如何实现运算符重载: 方式一:在类内定义,以成员方法(m...

2019-08-08 21:09:10 117 0

原创 Flutter和Dart系列十:Json序列化

在前一篇我们已经可以在Flutter中同服务器进行交互了,但是那时我们是通过String来接收的,即可以拿到json格式的数据,那么怎么来解析成实体对象呢? 1. 手动解析:借助于dart的内置库(dart:convert) dart:convert中有俩个top-level function...

2019-08-06 10:26:51 247 0

原创 Kotlin学习系列之:协程的创建(二)

在系列一中,我们已经对协程有了初步的了解,我们在此篇继续。前面我们是通过GlobalScope.launch{}这个协程建造器来创建协程的,它的特点就是: Launches a new coroutine without blocking the current thread. 即不会...

2019-08-01 16:57:13 70 0

原创 Kotlin学习系列之:协程的创建(一)

1.协程:Coroutine 2.如何去理解协程: 可以视为轻量级的线程 我们可以回顾一下什么是线程。从操作系统原理的角度来讲,进程是资源分配的基本单位,而线程是调度的基本单位,也就是说线程实际上是系统级别的,它运行与否是由操作系统决定的。从Java语言层面上讲,我们可以通过new Thr...

2019-07-20 23:32:33 111 0

原创 Flutter和Dart系列九:简单的网络请求

与其说是Flutter的网络请求,倒不如说是Dart的网络请求。实际上这块是对系列八第5点的一个复习,我们直接看代码: 在.yaml文件中添加http依赖,然后执行Packages get dependencies: flutter: sdk: flutter http...

2019-07-15 20:45:19 82 0

原创 grpc in Android

最近公司客户端同服务器的交互方式都换成了grpc,什么是grpc呢?我们在以后再去了解,此篇的目的就是带大家了解在android中如何去使用grpc. grpc-java的github地址:https://github.com/grpc/grpc-java。大家可以去浏览一下里面的文档说明,不用...

2019-05-07 16:03:17 555 0

原创 Flutter和Dart系列之八:路由

截至目前为止,我们的Widget都是在一个页面上实现的。对于一个App而言,不可能只有一个页面。那么在Flutter怎样实现页面间的跳转呢? 启动一个新的页面:Navigator.push(),类似Android中的startActivity class MyApp extends S...

2019-03-15 17:58:30 286 0

原创 final关键字在Android和Java中使用总结

final作用于类上:表示该类不可被继承 某些类在设计的时候,可能出于安全的考虑,不希望被继承,例如String类。final类中的属性和方法可以是final或者非final,但是由于不能被继承,也就意味着final类中的方法都是final的,当然你也可以显式去指定。在《Effective J...

2019-03-14 13:35:06 256 0

原创 Flutter和Dart系列七:Column和Row

对于线性的布局排列,Android中使用的是LinearLayout,至于是横向还是纵向,则是通过orientation属性来指定的,orientation=vertical表示纵向线性,orientation=horizontal表示横向线性。在Flutter中,将这两种线性布局分别用Colum...

2019-03-12 12:30:46 352 0

原创 DiskLruCache的源码分析

如何拿到一个DiskLruCache的对象? 通过DiskLruCache的open方法,因为它的构造是私有的,所以你不是能够直接new的。open方法有四个参数: directory:磁盘缓存的路径 appVersion:app的版本号,这个地方看清况传入,如果你想要当app升级时,...

2019-03-11 14:49:21 134 0

原创 基于《Android插件化开发指南》第5章对于"欺骗AMS"的思考

在我们初学Android阶段经常会遇到一个异常: Unable to find explicit activity class xxx; have you declared this activity in your AndroidManifest.xml? 异常信息提示的很清楚,原来...

2019-03-07 13:54:46 1000 0

原创 基于《Android插件化开发指南》第4章对于ActivityManager hook的思考

最近在读包建强老师的《Android插件化开发指南》一书,在读到第4章对于ActivityManager hook时,有点小启发。先看hook的代码(基于Android9.0源码,兼容Android7.0之前的版本代码需改动): public class HookHelper { ...

2019-03-04 16:35:51 694 1

原创 Flutter和Dart系列五:类和对象

Dart是一门面向对象的语言。和Java一样,它有个超级父类Object,所有的类都直接或间接继承该类。 定义一个类: class Point { num x = 0, y = 1; } 编写main方法来使用这个类: void main() ...

2019-03-01 17:04:37 360 0

原创 Flutter和Dart系列六:Widget(一)

我们先编写一个简单的demo: import 'package:flutter/material.dart'; void main() => runApp(Center( child: Text( 'Hello, world!&...

2019-02-28 18:28:44 368 0

原创 Flutter和Dart系列四:Function

Dart语言是一门真正面向对象的语言,函数也是一个对象,并且类型为Function,这点和Js是类似的。 定义Function: 返回类型 name (参数列表){ } 例如: bool isAdult(int age){ return age >= ...

2019-02-23 18:43:29 1787 0

原创 理解设计模式之:多层次的单例模式

多维度的单例模式 23种设计模式中,对于开发者而言,最熟悉不过就是单例模式了,单例模式的作用以及应用场景就不过多赘述了。今天我们的目的,主要是从多层次理解单例模式以及在实现单例模式中涉及的相关Java知识点。 饿汉式单例: public class Singleton { ...

2019-02-23 15:28:51 90 0

原创 Kotlin学习系列之:inline

inline: Kotlin中的一个关键字,用来修饰function,那么这个function就被称作inline function(内联函数)。最初接触内联函数这个概念还是当初在学校学习C语言时候提到的,Java中是没有这一概念的,如今Kotlin又引入这一特性。那么inline functio...

2019-02-01 10:30:11 502 0

原创 Java中数组和ArrayList的区别

Java中数组和List泛型的区别: ArrayList中存放的都是对象,即引用类型,即使我们可以向里面put一个基本数据类型,那么也是基于自动装箱特性,将基本数据类型转换成对象;而数组中可以是任意类型 从实际工作经历上看,数组中是可以间隔存null的,而ArrayList是做不到这一点的 ...

2018-12-13 16:03:29 2340 0

原创 Kotlin学习系列之:相等性比较(Equality)

   今天被同事问到了三个等于号啥意思,有点懵,去年学习的时候没怎么太注意,所以翻了翻文档,特此记录一下: 感觉文档上的概括很好,并且对于我如果回答==和equals的区别,感觉上面这种分类概括性很强:引用相等和结构相等。对于Object类中,equals方法的默认实现就是引用相等比较,如果...

2018-12-07 17:28:57 348 0

原创 理解设计模式之:装饰者模式

1. 装饰模式(Decorator Pattern):又可以称之为包装模式(Wrapper Pattern),结构型设计模式之一,使用一种对客户端透明的方式来动态地扩展对象的功能。 2. 模式角色分析: 抽象构件角色(Component):给出一个抽象接口,以规范准备接收附加责任的对象 具体...

2018-11-09 18:36:36 229 0

原创 理解设计模式之:责任链模式

1. 责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条 链传递该请求,直到有一个对象处理它为止。 2. 优点:使得接收者和发送者都没有双方的明确信息,且链中的对象自己也并不知道链...

2018-11-09 13:48:29 114 0

原创 Bugly热更新:天坑官方文档

   昨晚在集成Bugly的热更新到项目中的时候,打包安装到手机上,一直报错: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/tencent/tinker/entry/DefaultApplicationLike; 网上搜...

2018-11-02 10:49:01 728 0

原创 Android Realm数据库:Compilation failed; see the compiler error output for details.

   最近在项目中使用Realm数据库,然后就出现了一个莫名其妙的报错: Compilation failed; see the compiler error output for details. 如果再详细点: org.gradle.api.tasks.TaskExecutionExce...

2018-10-10 18:26:15 461 0

原创 Selector中android:constantSize属性

   今天之所以要提到这个属性,是因为开发中遇到的一个问题: 1. 先来看看ui图: 2. 为了实现这种很常见的效果,就使用了RadioButton,右边的图标就以drawableRight的形式添加进去: <selector xmlns:android="ht...

2018-09-28 14:22:11 329 0

原创 DataBinding踩坑系列之:与Kotlin一起使用的环境配置

   当将Kotlin和DataBinding一起使用的时候,发现在环境配置上总是有各种各样的问题,不是编译通不过,就是运行app时工程报错,最后折腾了一番再有了合适环境配置:     1. 首先是project的build.gradle文件: buildscript { ext.k...

2018-09-03 11:34:33 548 0

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