自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(97)
  • 资源 (4)
  • 收藏
  • 关注

原创 Java 并发之线程池 ThreadPoolExecutor

顶层的接口,用来执行提交的 Runnable 任务。这个接口提供了一种将任务提交和任务运行机制(包括线程的使用、调度等)解耦的方式。总而言之,它是一个顶层接口。

2024-01-26 14:57:11 600

原创 Java 并发之 ReentrantLock & AQS

**Since:1.5*/Lock 接口里的方法我们实际上可以看成三类:lock()、unlock()、newCondition()。第三类 newCondition() 方法我们暂且搁置一下,着重关注前面两个方法:上锁、解锁,可以类比 synchronized 关键字字节码层面的 monitorenter、monitorexit,对共享资源的访问放在中间。

2024-01-19 13:18:39 898

原创 Java 并发之《深入理解 JVM》关于 volatile 累加示例的思考

老师的目的是为了说明在多线程环境下 volatile 关键字只能保证可见性而不是线程安全的。但是当在我的 IDEA 下运行时,发现程序是没有输出结果且始终是终止不了的,有点纳闷,稍微一分析肯定是在 yield 这个地方有问题。这样程序就能够正常输出结果并退出了。

2024-01-07 19:53:07 561

原创 Java 并发之 wait、notify 机制三问

不会。那么什么时候才释放掉锁从而使得在 WaitSet 中的被唤醒的线程能够有机会重新竞争到锁呢?例如:在这段代码中,就是 foo() 方法执行完毕后,会释放掉 obj 对象的锁,换句话说,也就是 synchronized 代码块执行完毕后,从字节码层面也就是执行了 monitorexit 指令之后。简而言之,唤醒随机一个还是所有的区别,不过需要注意的是唤醒所有并不是所有等待的线程都会同一时刻恢复执行,还是需要竞争从而那个重新获取到锁的线程可以执行,毕竟同一时刻只可能有一个线程可以持有对象的锁。我们可以通

2024-01-06 16:00:03 877

原创 总结:判断 RecyclerView 中 View 的可见性

获取 RecyclerView 当前屏幕中可见 item 下标我们只需要设置对 RecyclerView 设置滑动监听即可(当 RecyclerView 停下滑动时进行检测):override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { super.onScrollStateChanged(recyclerView, newState) if (newState == RecyclerView

2021-01-26 15:58:44 8755 2

原创 Java并发之:wait和notify/notifyAll

Thread和Runnable联系:Thread类也实现了Runnable接口Java中创建线程的两种方式:继承自Thread类,然后重写其run方法声明一个类实现Runnable接口并实现抽象方法run,然后在创建Thread类实例时传入该声明类实例那么这两种方式哪种更好呢?答案是第2种:实现Runnable接口的这种方式。理由如下:耦合性更低,将线程和任务本身分离开来由于Java单继承的特性,继承了Thread类,那么意味着不能再继承其他类了。那么这两种方

2020-09-05 13:21:41 675

原创 Retrofit源码全方面解析

如今作为一个Android开发者,网络请求这块离不开square公司的全家桶,今天我们就来分析一下其中的Retrofit框架的源码。为什么使用Retrofit因为方便、直观,和OkHttp的结合天衣无缝:@GET("weather")fun weather(@Query("latitude") latitude: String, @Query("longitude") longitude: String): Flowable<String>通过注解,对于这样的一个GET请求,请求参数

2020-08-19 22:45:28 2040

原创 Kotlin学习系列之:协变和逆变

协变和逆变并不是Kotlin独有的概念,像Java、C#都有这样的概念,对于Java中协变和逆变的理解可参考笔者的另一篇文章。对于Java中协变和逆变的表示,可以通过这样一条PECS规则来概括:Producer Extends, Consumer Super.即仅仅是从该结构中读取数据,该结构就类似于一个生产者(Producer),此时使用"? extends Type";若仅仅是往该结构中放入数据,该结构就类似于一个消费者(Consumer),此时使用"? super Type"。此篇主要来介绍Kotli

2020-07-21 10:31:31 1010

原创 从源码角度理解HandlerThread和IntentService

基础:需要对于消息机制的四大部分有一定了解,可以参考此篇。HandlerThread.public class HandlerThread extends Thread { int mPriority; int mTid = -1; Looper mLooper; private @Nullable Handler mHandler; public HandlerThread(String name) { super(name); ..

2020-07-09 12:32:03 499

原创 写给Android开发者的ThreadLocal介绍

前几年在分析Android消息机制源码时,就碰到了ThreadLocal,但是当时就只引用了《Android开发艺术探索》中结论,没有深入细致地研究它的使用和细节。作为Android开发者而言,日常开发中应该很少使用到ThreadLocal类本身,应该是Java后台开发兄弟会用的多一点。但是,理解了ThreadLocal,可以加深对于Looper的理解。对于ThreadLocal,日常开发中一般有两种使用场景:每个线程需要一个独享的对象:比如Android中的Looper,后端中常用的工具类(如Sim

2020-07-07 22:26:03 593

原创 百度地图路径规划报错:RESULT_NOT_FOUND

最近在项目中集成百度地图,调用百度地图的路径规划功能时,一直报错:RESULT_NOT_FOUND。这让我很纳闷,因为这个功能在别的项目做过,已经很好的实现了,代码都是复制过来的。相同的代码,在新项目里就不行了。这困扰了我很久。最后找到了出现这个错误的原因:在百度地图控制台创建应用时,要注意:最好全部勾选。由于项目是接手过来的,所以我猜测之前的开发人员在创建应用时,肯定漏选了启用的服务~...

2020-07-01 23:25:35 1889

翻译 一步一步掌握在Android中使用Kotlin DSL

译者前言:在阅读本篇文章之前,你需要了解Kotlin以下知识点:扩展函数(Extension Function)中缀表达式或中缀调用(Infix Function)运算符重载(Operator Overloading)在这篇文章中,我们将要学习如何在Android项目中编写Kotlin DSL。本文篇幅较长,需要花费一定时间来阅读,从而来一起编写DSL。我们将会阐述以下话题:从通俗语言角度来说,DSL是什么你正在使用哪种DSL我们为什么需要使用DSL我们如何去编写自己的DSL基本示

2020-06-22 17:44:47 912

原创 源码解析:在Room和Retrofit中使用协程

今天我们就来从源码的角度上分析Room ORM框架以及Retrofit是如何实现对于Kotlin协程的支持的。 前提知识:对于Kotlin协程有所了解,不了解的同学可以参考下面系列文章。 Kotlin学习系列之:协程的创建(一) Kotlin学习系列之:协程的创建(二) Kotlin学习系列之:协程的创建(三) Kotlin学习系列之:协程的取消和超时 Kotlin学习系列之:使用async和await实现协程高效并发 Kotlin学习系列之:协程上下文与分发器 核心

2020-06-12 14:27:46 829

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

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

2020-05-03 18:44:10 683

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

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

2020-05-02 20:22:35 362 1

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

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

2020-04-28 16:29:47 615

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

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

2020-04-11 15:21:14 705

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

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

2020-03-31 18:12:26 2181 1

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

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

2020-03-22 00:28:45 834

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

引例:private suspend fun intValue1(): Int { delay(1000) return 1}private suspend fun intValue2(): Int { delay(2000) return 2}fun main() = runBlocking { val elapsedTime = me...

2020-03-20 00:33:36 18233

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

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

2020-03-19 16:30:58 7256

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

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

2020-03-16 20:35:27 1175 2

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

​ 红黑树(Red-Black Tree)是一种非常重要的数据结构,在开发中我们时常能够见到它的身影,如JDK中的TreeMap、TreeSet以及JDK8中的HashMap,在它们的底层实现中都使用到了红黑树。红黑树的学习成本还是挺高的,为了掌握这一数据结构,我们决定从二叉排序树开始讲起,然后逐步衍生到AVL树、2-3树,最后再过渡到红黑树。本篇就是此系列的第一篇:二叉排序树。二叉排...

2020-03-15 13:25:41 166

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

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

2020-02-06 13:48:47 1095

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

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

2020-01-10 11:17:17 1758

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

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

2019-11-23 17:58:46 6186 7

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

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

2019-08-15 16:28:10 2735

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

1. 定义:当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。2. 对状态模式的理解:状态模式中的行为是由状态决定的,不同的状态下有不同的行为。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。3. 状态模式中的角色:Context:环境角色,定义客户感兴趣的接口,维护一个State子类的实例,这个实例定义了对象的当前状态 State:抽象状...

2019-08-13 19:22:34 207

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

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

2019-08-08 21:09:10 1563

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

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

2019-08-06 10:26:51 1512 1

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

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

2019-08-01 16:57:13 356

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

1.协程:Coroutine2.如何去理解协程: 可以视为轻量级的线程 我们可以回顾一下什么是线程。从操作系统原理的角度来讲,进程是资源分配的基本单位,而线程是调度的基本单位,也就是说线程实际上是系统级别的,它运行与否是由操作系统决定的。从Java语言层面上讲,我们可以通过new Thread().start这种形式去启动一个线程,我们可以查看Thread类的源代码: publi...

2019-07-20 23:32:33 673

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

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

2019-07-15 20:45:19 408

原创 grpc in Android

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

2019-05-07 16:03:17 1558

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

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

2019-03-15 17:58:30 798

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

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

2019-03-14 13:35:06 938

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

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

2019-03-12 12:30:46 1215

原创 DiskLruCache的源码分析

如何拿到一个DiskLruCache的对象? 通过DiskLruCache的open方法,因为它的构造是私有的,所以你不是能够直接new的。open方法有四个参数: directory:磁盘缓存的路径 appVersion:app的版本号,这个地方看清况传入,如果你想要当app升级时,之前的缓存失效,那么这个地方你就可以传入当前app的版本号;否则的话,缓存在app升级时仍然保留,...

2019-03-11 14:49:21 373

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

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

2019-03-07 13:54:46 1307

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

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

2019-03-04 16:35:51 1111

深入探索Android热修复技术原理

阿里巴巴团队对于热修复介绍的书籍,业界良心!

2017-07-03

Linux内核探秘 深入解析文件系统和设备驱动的架构与设计

Linux内核探秘的PDF

2016-05-14

Linux网卡驱动学习笔记

本人Linux网卡DM9000学习笔记,和本人博客是一样的,此上传是为了更好的观看,因为博客的图片有问题

2016-04-09

linux字符乱码

字符乱发:linux,使得可以解决字符乱码的问题!linux学习从这里开始!

2014-08-23

空空如也

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

TA关注的人

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