自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(93)
  • 问答 (14)
  • 收藏
  • 关注

原创 协程的异常处理3:协程的异常

我将翻译四篇介绍协程的 取消 和 异常处理 相关的文章,四篇文章是层层递进的关系。翻译过程中我将尽量忠实于原文。当然,由于水平有限,不能保证完全的翻译正确。如果您发现翻译有错误之处,欢迎在评论里指出。我也将贴出每篇翻译的原文。第一篇:《协程:第一件事》(原文: Coroutines: first things first)第二篇:《协程的取消》(原文:Cancellation in coroutines)第三篇:《协程的异常》(原文:Exceptions in coroutines)第四篇:《不应

2021-11-22 13:39:31 769

原创 协程的异常处理2:协程的取消

我将翻译四篇介绍协程的 取消 和 异常处理 相关的文章,四篇文章是层层递进的关系。翻译过程中我将尽量忠实于原文。当然,由于水平有限,不能保证完全的翻译正确。如果您发现翻译有错误之处,欢迎在评论里指出。我也将贴出每篇翻译的原文。第一篇:《协程:第一件事》(原文: Coroutines: first things first)第二篇:《协程的取消》(原文:Cancellation in coroutines)第三篇:《协程的异常》(原文:Exceptions in coroutines)第四篇:《不应

2021-11-17 14:57:14 1488

原创 协程的异常处理1:第一件事

我将翻译四篇介绍协程的 取消 和 异常处理 相关的文章,四篇文章是层层递进的关系。翻译过程中我将尽量忠实于原文。当然,由于水平有限,不能保证完全的翻译正确。如果您发现翻译有错误之处,欢迎在评论里指出。我也将贴出每篇翻译的原文。第一篇:《协程:第一件事》(原文: Coroutines: first things first)第二篇:《协程的取消》(原文:Cancellation in coroutines)第三篇:《协程的异常》(原文:Exceptions in coroutines)第四篇:《不应

2021-11-12 11:00:58 2558

原创 协程2:结构化并发

我将翻译三篇介绍协程的文章:第一篇:介绍协程的背景知识;第二篇:介绍协程的结构化并发;第三篇:结合实例,介绍协程的实际使用场景;那么,这是第二篇,原文是 Coroutines on Android (part II): getting started文章目录1. 协程跟踪2. 使用 scope 取消任务2.1 启动新的协程2.2 在 ViewModel 中开启3. 跟踪任务3.1 跟踪海量任务4. 协程失败时的报错5. 使用结构化并发1. 协程跟踪在第一篇里,我们探究了协程善于解决的问

2021-11-05 16:04:23 706

原创 coroutineScope和supervisorScope的区别

文章目录1. 区别2. 举例说明2.1 launch发起的协程2.2 async发起的协程1. 区别coroutineScope和 supervisorScope都是用来创建一个 CoroutineScope并执行代码块,创建的 CoroutineScope将继承上一级 CoroutineScope的 CoroutineScope.coroutineContext,但是会重写 croutineContext的 Job。它们的区别在于 coroutineScope的 coroutine 是一个 Scop

2021-11-02 18:27:13 2068

原创 协程1:背景知识

我将翻译三篇介绍协程的文章:第一篇:介绍协程的背景知识;第二篇:介绍如何在Android中使用协程;第三篇:结合实例,介绍协程的实际使用场景;那么,这是第一篇,原文是 Coroutines on Android (part I): Getting the background文章目录1. 协程能解决什么问题?2. 长时间运行任务3. 使用协程执行长时间运行任务4. 协程的主线程安全5. withContext 的性能6. 总结1. 协程能解决什么问题?Kotlin协程引入了一种新的并发

2021-11-01 14:08:47 1419

原创 协程3:suspend函数实现原理

文章目录@[toc]第一节:State Machine(状态机)1.1 kotlin源码1.2 编译器生成的代码(细节有删减)第二节:Continuation2.1 BaseContinuationImpl第三节:launch流程第一节:State Machine(状态机)状态机是一种数学计算模型。一个状态机通常有以下几个部分:状态,一个状态机至少要有两个状态输入,输入触发状态机执行操作,对应不同的状态,对输入值执行不同的操作变换,执行操作之后,切换状态机的当前状态状态机示例:enum

2021-10-29 17:13:23 620

原创 RegisterForActivityResult介绍

RegisterForActivityResult介绍1. 添加引用库2. 相关类和方法介绍2.1 ActivityResultContract2.2 ActivityResultCallback3. 示例4. 官方的封装4.1 实现startActivityForResult4.2 实现requestPermissions首先介绍一下其作用:它可以取代 startActivityForResult方法,获取另一个Activity的返回结果。它可以取代 requestPermissions方法,用

2021-07-12 19:20:35 8591 2

原创 自定义异常处理

首先,Java中定义异常的顶级类是 Throwable,它是 Error类和 Exception类的父类。只有继承于 Throwable类或其子类的对象才能被Java虚拟机或者Java的 throw语句抛出。同样,也只有这样的类才能作为被 catch语句捕获的参数类型。Java中的异常可以分类两类:一类是检测异常(checked exception),又称作编译时异常,它必须在编译阶段处理,一般使用 try...catch来捕获处理,或者用 throws关键字声明。另一类是非检测异常(uncheck

2021-01-29 20:28:05 231

原创 LeakCanary实现原理简析

文章目录1. LeakCanary初始化1.1 在ContentProvider中初始化LeakCanary1.2 初始化默认观察器1.3 跟踪观察被销毁的对象2. 观察对象的存活状态3. 分析泄漏对象4. 其它原理这两个字,会让人觉得太深奥,其实只是简单了解下。我记得以前用 LeakCanary的时候,需要在 Application里面进行初始化。版本升级之后发现只需要在 build.gradle里面引用它就可以了,不需要手动初始化,那么它是如何运行起来的呢?1. LeakCanary初始

2021-01-11 21:13:59 555

原创 自定义Lint检查规则

文章目录一、Lint基本使用介绍1. 界面操作2 命令行运行二、自定义Lint规则第一步:创建一个Lint规则库1.1 定义Issue1.2 定义Detector1.3 定义并配置Registry第二步:创建一个Android库第三步:在项目中添加自定义Lint规则三、Lint检查的配置四、总结Lint是 Android Studio里面提供的一个代码检查工具,相信大多数Android开发者都用过或了解过Lint,它可以用来对项目做一些基本的但却非常有必要的代码检查,以帮助开发者提升程序的可靠性和性能,

2021-01-08 20:16:45 1825 1

原创 JVM垃圾回收机制

文章目录第一章:垃圾回收简介1.1 什么是自动垃圾回收1.2 自动垃圾回收基本流程第一步:标记 Marking第二步a:正常删除 Normal Deletion第二步b:压缩删除 Deletion with Compacting1.3 分代垃圾回收 Genrational Garbage Collection为什么使用分代垃圾回收?JVM分代第二章:分代垃圾回收过程第三章:垃圾收集器配置3.1 堆相关的参数配置3.2 串行垃圾回收器 The Serial GC3.2 并行垃圾回收器 The Parallel

2020-12-29 16:45:13 187

原创 Java虚拟机简介

文章目录@[toc]JVM是什么JVM架构概览类加载子系统 (ClassLoader Subsystem)加载 Loading连接 Linking初始化 Intialization运行时数据区 Runtime Data Area执行引擎 Execution Engine本地编程接口 Java Native Interface本地方法库 Native Method Libraries最近在网上看了不少介绍Java虚拟机(JVM)的文章,但总觉得看完之后一知半解。所以决定阅读官方文档,按照自己的理解来写几篇

2020-12-27 14:33:49 310 4

原创 Handler消息机制

文章目录认识Handler类Handler的初始化认识LooperLooper的初始化Looper如何处理消息认识MessageQueue认识MessageHandler发送消息Handler处理消息总结认识Handler类首先看一下Handler源码的官方介绍:A Handler allows you to send and process {@link Message} and Runnable objects associated with a thread’s {@link Messa

2020-12-24 00:40:57 194

原创 Effective Java: 第三章 类和接口

文章目录Item1: 使类和成员的可访问性最小化1.1 顶层类和接口1.2 成员(域、方法、嵌套类和嵌套接口)Item2: 公有类不应该暴露可变的域Item3: 使可变性最小化Item4: 复合优先于继承继承的缺点复合Item5: 要么设计继承并提供文档,要么禁止继承编写为了继承而设计的类禁止子类化Item6: 接口优先于抽象类现有的类可以很容易被更新,以实现新的接口接口是定义Mixin(混合类型)的理想选择接口允许构造非层次结构的类型框架Item7: 为后代设计接口Item8: 接口只用于定义类型Item

2020-07-21 21:25:49 220

原创 Java抽象骨架实现

文章目录接口实现抽象类实现抽象骨架实现类我们已经知道,Java提供了两种机制来定义允许多个实现的类型:接口和抽象类。但是这两种机制在某些情况下存在着一些我们不喜欢的地方。比如,我们想模拟不同品牌的Android手机,需要实现一些手机的基本功能:开机、调节音量、下载App。接口实现我们先定义一个接口IAndroidPhone,提供相应的接口方法:interface IAndroidPhone { void powerOn(); void setVolume(int volu

2020-07-15 18:08:14 704 3

原创 Effective Java: 第二章 Object类的方法

文章目录Item1: 覆盖equals时请遵守通用约定无需覆盖的情况覆盖的规范实现高质量的equals方法Item2: 覆盖equals方法时总要覆盖hashCode方法糟糕的hasCode方法具体实现更多的优化注意事项Item3: 始终要覆盖toString方法Item4: 谨慎地覆盖clone方法基本实现深度拷贝拷贝构造器Item5: 考虑实现Comparable接口尽管Object是一个具体类,但设计它主要是为了扩展。它的所有非final方法(equals、hashCode、toString、clo

2020-07-05 22:38:52 182

原创 Effective Java: 第一章 创建和销毁对象

本章关注于创建与销毁对象:何时并如何创建对象,何时并如何避免创建对象,如何确保对象适时适当地被销毁,并且如何在销毁对象之前做好清理工作。Item 1:考虑使用静态工厂方法替代构造方法优点1:静态工厂方法拥有名字传统的构造方法名字必须和类名一致,如果可以接受不同个数的参数来初始化,那么必须声明多个构造方法且构造方法的名字一样,只能依靠参数来区分要创建的对象。而使用静态工厂方法,构造对象时可以为接受不同参数的对象起不同且容易区分的适当的名字。优点2:静态工厂方法不用每次调用都创建一个新的对象例.

2020-06-30 18:30:21 235

原创 Java线程同步

[TOC]为什么要同步呢?因为一个资源可能同时被多个线程任务修改或访问,这样的话就会造成混乱。为了避免这种混乱,让该资源一次只能被一个线程修改/访问,这就叫做线程同步。 1. Synchronized 关键字被 synchronized 关键字标记的代码块称为同步块,在任意给定的时间只允许一个线程执行同步块。synchronized关键字有三种用法:用来标记非static方法用来标...

2019-08-12 14:56:10 200

原创 Java线程池

文章目录1. 创建线程池常用的方法2. 举例比较线程池就是多个可执行任务的线程的集合,在执行大量线程任务的时候,由于线程池里的线程可以复用,因而可以减少新建和调用线程的次数,从而提高性能。此外,使用线程池让你无需管理线程的生命周期,它让你在利用线程优势的同时,只需专注于任务的执行,而无需关心线程机制。1. 创建线程池常用的方法介绍几个常用的创建线程池的方法(使用 Executors类的...

2019-08-12 14:49:43 155

原创 Thread类方法介绍

1. sleepThread.sleep(long millis)值不能为负值,否则会抛 IllegalArgumentException 异常Thread.sleep(long millis, int nanos)可以传入纳米时长,更精准控制时间,nanos取值范围为(0-999999)调用Thread.sleep()方法会使线程调度器把当前线程至于TIMED_WAITING状态...

2019-08-12 14:33:17 450

原创 创建线程任务

文章目录@[toc]1. 创建线程1.1 通过Runnable接口创建线程1.2 通过Thread类创建线程1.3 实例说明2. 返回结果的线程任务 Callable 和 Future2.1 Callable接口2.1.1 Callable与Runnable的区别2.1.2 实现Callable接口的例子2.2 Future接口2.2.1 FutureTask3. 定时线程任务 Timer 和 T...

2019-08-12 14:28:50 375

原创 Didn't find class "android.os.PersistableBundle"

文章目录报错日志原因解决办法报错日志# main(1)java.lang.ClassNotFoundException Didn't find class "android.os.PersistableBundle" on path: DexPathList[[dex file "dalvik.system.DexFile@42c3d798", dex file "dalvik.system....

2019-02-19 15:39:23 500

原创 Java多线程

文章目录0. 线程(Thread)介绍0.1 使用多线程的优势0.2 多任务处理0.3 进程和线程关系图1. 创建线程任务2. 线程的生命周期3. 线程调度(Thread Scheduling)3.1 优先调度(preemptive scheduling)3.2 时间片(Time-Slicing)4. Thread类方法介绍5. 线程池(Thread Pool)6. 线程同步0. 线程(Thr...

2019-02-02 17:07:28 179

原创 了解Java注解

此文将介绍注解的三个方面:文章目录1. Java内建的注解2. 自定义注解3. 反射注解1. Java内建的注解Java有三个内建的注解@Override - 当重写父类方法的时候,我们使用这个注解来通知编译器我们正在重写这个方法。当父类的这个方法被移除或改变的时候,编译器会提示一个错误信息。@Deprecated - 这个注解用来告诉编译器某个方法已经被废弃。当某个地方调用此方...

2019-01-25 10:51:40 187

原创 如何屏蔽百度

昨天起微软的搜索引擎Bing在国内无法打开,目前仍然无法使用。然而不能用谷歌,不能用Bing,难道我们就要用百度吗? 当然不用。至少我就没见过吃不上饭的人转而去吃屎的。推荐的搜索引擎先推荐几个搜索引擎谷歌搜索引擎当然首推谷歌,当然目前是处于被防火墙状态,但是我真心建议花两个小时或者半天或者一天时间去学习如何科学翻墙,租一个海外服务器(每年一两百块钱),然后自己搭建vpn。这点时间和...

2019-01-24 15:32:27 9603 4

原创 了解Java反射

文章目录@[toc]1. 类反射1.1 Class 对象1.2 类名称1.3 修饰符1.4 包信息1.5 父类1.6 实现的接口1.7 构造方法1.8 方法1.9 字段1.10 注解2. 构造方法(Constructor)2.1 获取Constructor对象2.2 构造参数2.3 使用Constructor来实例化对象3. 字段(Field)3.1 获取字段对象3.2 字段名3.3 字段类型3....

2019-01-23 18:00:29 201

原创 带滑动反弹效果的ViewPager

参考了几篇代码,自己弄了一个带滑动反弹效果的ViewPager。代码非常简单,主要原理就是随着手指的移动改变View的X坐标。那么直接就简单粗暴地上代码了:public class BounceBackViewPager extends ViewPager { private int currentPosition = 0; private boolean handleMo...

2019-01-03 18:00:42 438 1

原创 WorkManager的使用

WorkManager可以用来轻松地创建一个任务,然后放手让它在你指定的某种条件下运行。在项目中引入WorkManager:dependencies { def work_version = "1.0.0-alpha11" implementation "android.arch.work:work-runtime-ktx:$work_version" }1. 相关类和...

2018-11-16 17:53:39 1131

原创 Room数据库的使用

废话也不多说了,Room数据库就是对SQLite数据库的封装,使之用起来更方便。Google也说了强烈推荐使用Room来替代SQLite。1.在项目中添加Roomdependencies { ... def room_version = "2.1.0-alpha02" implementation "androidx.room:room-runtime:$room_vers...

2018-11-14 15:44:32 7546

原创 AbsSavedState cannot be cast to HorizontalScrollView$SavedState

具体报错信息如下:java.lang.RuntimeException:Unable to start activity ComponentInfo{com.fsgx.car.android.igo/com.fsgx.car.android.igo.usercenter.mytrips.MyTripsActivity}: java.lang.ClassCastException: androi...

2018-10-11 18:05:01 1343

原创 Kotlin学习之类与对象篇—委托属性

定义委托属性class Example { var p: String by Delegate()}委托属性的定义语法是:val/var <属性名>: <类型> by <表达式>。by 后面的表达式就是委托, 属性的get()/set()将被委托给它的getValue()和setValue()方法。属性委托不必实现任何接口,但是它们必须提供...

2018-08-15 14:26:53 206

原创 Kotlin学习之类与对象篇—委托

委托属性委托属性将单独作为一章讲解,这里先不提委托实现interface Base { fun print()}class BaseImpl(val x: Int) : Base { override fun print() { println(x) }}class Derived(b: Base) : Base by bfun main(arg...

2018-08-13 09:51:19 199

原创 Kotlin学习之类与对象篇—对象

有时候我们需要创建与某个类稍微不一样的一个对象,但不用为此显示地声明一个子类。Java使用匿名内部类来处理这种情况,Kotlin用对象表达式和对象声明略微概括了这个概念。对象表达式创建一个继承自某个(或某些)类型的匿名类对象:window.addMouseListener(object : MouseAdapter(){ override fun mouseClicked(...

2018-08-10 10:39:17 219

原创 Kotlin学习之类与对象篇—枚举类

枚举类的基本用法是实现类型安全枚举:enum class Direction { NORTH, SOUTH, WEST, EAST}每个枚举常量都是一个对象,枚举常量用逗号隔开。 初始化由于每个枚举都是枚举类的一个实例,他们能初始化如下:enum class Color(val rgb: Int) { RED(0xFF0000), ...

2018-08-09 10:40:08 253

原创 Kotlin学习之类与对象篇—嵌套类和内部类

嵌套类kotlin嵌套类声明如下:class Outer { ... .. ... class Nested { ... .. ... }}嵌套类相当于外部类的一个成员,所以Outer可以用.符号来调用其嵌套类Nested以及Nested类里面的成员。一个嵌套类例子:class Person{ class Student...

2018-08-08 14:52:24 1150

原创 Kotlin学习之类与对象篇—密封类

密封类(Sealed Classes)用来表示受限的类继承结构:当一个值的类型只能取自一个有限类型集合中的类型时。在某种程度上,密封类是枚举类的扩展:枚举类型的取值也是受限的,但是每个枚举常量只能有一个实例,而密封类的子类可以有多个实例并且可以包含状态。声明一个密封类,要把sealed修饰符放在类名的前面。密封类可以有子类,但是子类必须声明在和密封类相同的文件中。sealed class ...

2018-08-07 10:00:08 468

原创 Stetho调试无法查看本地数据

Stetho调试一直用得好好的,几周前突然发现Inspect的Resources选项显示空白,而其它项都能用,比如Network、Elements,所以应该不是网络或者GFW的原因。尝试了好多方法,都没用,今天在stackoverflow找到一个有效的方法: 在Chrome浏览器上打开chrome://appcache-internals/,并清除掉其中的manifest 的缓存,然后...

2018-08-06 10:28:23 917

原创 App不显示桌面图标

最近调试App,运行之后一切正常,可是退出App之后,手机桌面上却找不到App的图标。到应用程序里去找,倒是可以找到。在网上查了一些资料,终于找到原因:最近在App的启动页添加了Scheme跳转功能,于是在AndroidManifest.xml文件中,启动页的配置如下:<activity android:name=".splash.SplashActivity" ...

2018-07-26 17:01:06 6913 2

原创 监听App是否处于前台

今天需要实现一个需求,就是当App对用户不可见时,停止App的某些功能。那么该如何监听App是否处于前台呢?哈哈哈!非常简单,只需要用接口 Application.ActivityLifecycleCallbacks 就能实现该功能。只需要两步,就能实现前后台监听: 一、实现接口 ActivityLifecycleCallbacks基本思路:自定义一个类并实现ActivityLife...

2018-07-16 17:57:32 2091 5

空空如也

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

TA关注的人

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