- 博客(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
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人