自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

赵彦军

做一只快乐的程序猿!

  • 博客(15)
  • 资源 (2)
  • 收藏
  • 关注

原创 Retrofit 注解参数详解

文章目录GET@Path@Query@QueryMapPOST@Bodyform表单1:@FormUrlEncodedform表单2:FormBody@Multipart上传文件对Retrofit已经使用了一点时间了,是时候归纳一下各种网络请求的service了。下面分为GET、POST、DELETE还有PUT的请求,说明@Path、@Query、@QueryMap、@Body、@Field的用法。添加依赖implementation 'com.squareup.retrofit2:retrofit

2021-10-28 15:54:54 1221 2

原创 Android 断点续传实现原理

下载原理在介绍断点续传之前,我们先说说下载的原理。代码示例用 OkHttp 作为示例。下载核心思路是把 responseBody 写入文件,核心代码如下:但是这种做法有个明显的问题,假如手机在下载文件的时候下载了80%,某些原因断网了,如果不支持断点续传,那就只有被迫重头开始下载。但是如果有断点续传的加持,就只需要下载最后 20% 的资源,避免重新下载。断点续传原理1、java.io.RandomAccessFile断点续传/下载需要使用到 java.io.RandomAccessFile 类

2021-10-25 17:36:19 1340

原创 Android Context Hook

Context Hook在 Android 编程中,我们常常会和 Context打交道,而且 Context 遍布各个地方,就算使用 Jetpack Compose 也都离不开它。正因为 Context 被广泛的使用和传播,当我们面对一些特殊问题时,常常能够从 Context对象入手,去解决许多看似不能改变的代码问题。这常常就会用到 Context Hook 这种手法。Context Hook 形式其实特别简单,就是使用 ContextWrapper 对原有的 Context 进行代理,从而实现 Con

2021-10-25 17:04:17 1649

原创 Java字符串、文件MD5工具类

Hex首先定义 Hex 工具类, 来源于 apache 开源工具类 https://commons.apache.org/proper/commons-codec/download_codec.cgi/** * @author : zhaoyanjun * @time : 2021/6/8 * @desc : file md5值 https://commons.apache.org/proper/commons-codec/download_codec.cgi */public class

2021-10-20 20:27:23 445

原创 Java原子操作Atomic

Java的java.util.concurrent包除了提供底层锁、并发集合外,还提供了一组原子操作的封装类,它们位于java.util.concurrent.atomic包。AtomicInteger我们以AtomicInteger为例,它提供的主要操作有:增加值并返回新值:int addAndGet(int delta)加1后返回新值:int incrementAndGet()获取当前值:int get()用CAS方式设置:int compareAndSet(int expect, int

2021-10-19 21:33:04 695

原创 Java线程安全StampedLock

ReadWriteLock前面介绍的ReadWriteLock可以解决多线程同时读,但只有一个线程能写的问题。如果我们深入分析ReadWriteLock,会发现它有个潜在的问题:如果有线程正在读,写线程需要等待读线程释放锁后才能获取写锁,即读的过程中不允许写,这是一种悲观的读锁。要进一步提升并发执行效率,Java 8引入了新的读写锁:StampedLock。StampedLock和ReadWriteLock相比,改进之处在于:读的过程中也允许获取写锁后写入!这样一来,我们读的数据就可能不一致,所以,

2021-10-19 21:02:27 457

原创 Java阻塞队列 LinkedBlockingDeque

LinkedBlockingDequeLinkedBlockingDeque类实现了BlockingDeque接口。阅读BlockingDeque文本以获取有关的更多信息。Deque来自“双端队列” 这个词。Deque是一个队列,你可以在插入和删除队列两端的元素。LinkedBlockingDeque是一个Deque,如果一个线程试图从中获取一个元素,而队列空的,不管线程从哪一端试图获取元素,都会被阻塞。以下是实例化和使用LinkedBlockingDeque的例子:BlockingDeque&l

2021-10-19 10:47:35 1062

原创 Java栈 Stack

Stack栈(Stack)是一种后进先出(LIFO:Last In First Out)的数据结构。什么是LIFO呢?我们先回顾一下Queue的特点FIFO:所谓FIFO,是最先进队列的元素一定最早出队列,而LIFO是最后进Stack的元素一定最早出Stack。如何做到这一点呢?只需要把队列的一端封死:因此,Stack是这样一种数据结构:只能不断地往Stack中压入(push)元素,最后进去的必须最早弹出(pop)来:Stack只有入栈和出栈的操作:把元素压栈:push(E);把栈顶的

2021-10-18 19:33:19 487

原创 Java队列 PriorityQueue

PriorityQueue我们知道,Queue是一个先进先出(FIFO)的队列。在银行柜台办业务时,我们假设只有一个柜台在办理业务,但是办理业务的人很多,怎么办?可以每个人先取一个号,例如:A1、A2、A3……然后,按照号码顺序依次办理,实际上这就是一个Queue。如果这时来了一个VIP客户,他的号码是V1,虽然当前排队的是A10、A11、A12……但是柜台下一个呼叫的客户号码却是V1。这个时候,我们发现,要实现“VIP插队”的业务,用Queue就不行了,因为Queue会严格按FIFO的原则取出队

2021-10-18 16:42:42 385

原创 Java队列 Deque

我们知道,Queue 是队列,只能一头进,另一头出。如果把条件放松一下,允许两头都进,两头都出,这种队列叫双端队列(Double Ended Queue),学名Deque。Java集合提供了接口Deque来实现一个双端队列,它的功能是:既可以添加到队尾,也可以添加到队首;既可以从队首获取,又可以从队尾获取。我们来比较一下Queue和Deque出队和入队的方法:QueueDeque添加元素到队尾add(E e) / offer(E e)addLast(E e) / o

2021-10-18 16:32:51 590

原创 Java队列 Queue

Queue队列(Queue)是一种经常使用的集合。Queue实际上是实现了一个先进先出(FIFO:First In First Out)的有序表。它和List的区别在于,List可以在任意位置添加和删除元素,而Queue只有两个操作:把元素添加到队列末尾;从队列头部取出元素。超市的收银台就是一个队列:在Java的标准库中,队列接口Queue定义了以下几个方法:int size():获取队列长度;boolean add(E)/boolean offer(E):添加元素到队尾;E rem

2021-10-18 16:08:52 1161

原创 Android View Binding的使用

什么是View BindingView Binding是Android Studio 3.6推出的新特性,目的是为了替代findViewById(内部实现还是使用findViewById)。。在启动视图绑定后,系统会为改模块中的每个xml文件生成一个绑定类,绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。View Binding 的优点Null 安全:由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险。此外,如果视图仅出现在布局的某些配置

2021-10-13 21:08:52 1987 2

原创 Java线程安全Lock、ReentrantLock、ReentrantReadWriteLock

文章目录前言LockReentrantLock公平锁/非公平锁超时机制可重入锁读写锁 ReentrantReadWriteLock源码结构总结示例前言java5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁的功能,它提供了与synchronized关键字类似的同步功能。既然有了synchronized这种内置的锁功能,为何要新增Lock接口?先来想象一个场景:手把手的进行锁获取和释放,先获得锁A,然后再获取锁B,当获取锁B后释放锁A同时获取锁C,当锁C获取后,再释放锁B同时获取锁D,以此

2021-10-13 20:32:26 559

原创 Java线程安全集合总结

从Java5开始,在Java.util.concurrent包下提供了大量支持高效并发访问的集合接口和实现类,如下图:从图中可以看出,这些线程安全的集合主要分为两类,以Concurrent开头的集合类和以CopyOnWrite开头的集合类。1、以Concurrent开头的集合类,可以支持多个线程并发写入访问,写入操作都是线程安全的,读取操作不必锁定,采用更复杂的算法保证永不会锁住整个集合,因此在并发写入时有较好的性能。ConcurrentLinkedQueue实现多线程高效、无须等待的访问,不能使用

2021-10-13 18:08:01 2928

原创 Android ConstraintLayout ConstraintSet动态布局

在传统布局方式中,如果要改变某个控件的位置,需要获取 LayoutParams , 后台修改属性值就行了。但是在约束布局 ConstraintLayout 中,要改变控件的约束条件,需要用到 ConstraintSet 类。主要有 5 个步骤第一步:创建 ConstraintSet() 实例 val set = ConstraintSet()第二步:需要复制一份父布局的约束,方法有三个如下set.clone(constraintLayout: ConstraintLayout);set

2021-10-12 19:58:06 6104 1

Pepk 签名压缩工具

Android app 签名生成工,执行完命令,会生成 output.zip , 然后把 output.zip 上传即可,非常好用

2020-04-16

XShell+XFtp

灵活、轻便的SFTP/FTP客户端 通过Xftp 5在网络中安全传输文件,实现多窗口 编辑,进行文件同步。

2018-02-26

空空如也

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

TA关注的人

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