- 博客(57)
- 资源 (1)
- 收藏
- 关注
原创 Eventbus 3.3.1源码分析
EventBusEventBus is a publish/subscribe event bus for Android and Java.EventBus是适用于Android和Java的发布/订阅事件总线。优点:简化组件之间的通信将事件发送方和接收方解耦在活动、片段和后台线程中表现良好避免复杂且容易出错的依赖关系和生命周期问题使代码更简单速度快很小(~60k jar)在实践中被安装量超过 1,000,000,000 的应用证明具有高级功能,如交付线程,订阅者优先级
2022-01-22 12:06:53 2740
原创 rxjava3 源码解析
RxjavaRxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.RxJava– JVM的反应式扩展– 一个用于使用Java虚拟机的可观察序列编写异步和基于事件的程序的库。 使用的主要设计模式包括:观察者模式,装饰器模式,适配器模式(函数传参不同有不同
2022-01-19 17:36:58 2730
原创 Retrofit 2.9.0 源码解析
Retrofit 2.9.01 Retrofit 1.1 retrofit介绍A type-safe HTTP client for Android and Java. 一个安全类型的http请求的客户端。底层网络请求是基于okhttp,retrofit对其进行了封装,提供了方便高效的网络访问框架 1.2 Retrofit 使用1.2.1 简单使用class RetrofitActivity : AppCompatActivity() { override fun onCreate
2021-12-25 20:58:49 1747
原创 Android Studio登录github踩坑实录
Android Studio登录github踩坑实录因为导入项目出现问题,重新安装了一次Android Studio(如果下载不了SDK的问题,请先在本机完全卸载干净AS,再下载新的AS,不然下载SDK会出现无法勾选SDK版本(installed)的问题),导致重新登录github出现问题(查找资料很久都无法解决自己的问题),特此写博客记录一下,防止后续有人再次出现这种无聊问题谷歌很久无法解决。问题一点击add account,JetBrain 自动跳转界面。点击 Authorize in G
2021-12-05 11:20:49 1760 1
原创 OkHttp4.9.3源码解析
OkHttp4.9.3okhttp内部逻辑流程图:1. 整体结构OkHttpClientRequest 和 ResponseRealCallOkHttpClient:核心管理类,所有内部逻辑和对象归OkHttpClient统一管理,由Builder构造器生成。Request 和 Response:两个累完全符合http协议所定义的请求内容和响应内容Request:发送请求封装类,包含url、method、headers、bodyResponse:返回结果,包含code、messa
2021-12-03 22:53:57 848
原创 LeetCode 300. 最长递增子序列
一、问题描述给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。二、测试数据示例 1:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例 2:输入:nums = [0,1,0,3,2,3]输出:4示例 3:输入:nums =
2021-09-02 15:10:08 167
原创 Android 消息机制详解(源码分析ThreadLocal、Looper、Handler、AsyncTask)
Android 消息机制1 概述Android 的消息机制主要是指 Handler 的运行机制以及 Handler 所附带的 MessageQueue 和 Looper 的工作过程。Android 应用是事件驱动的,每个事件都会转化为一个系统消息,即 Message 。消息中包含了事件相关的信息以及这个消息的处理人——Handler。每个进程中都有一个默认的消息队列(Message Queue,采用单链表的形式来存储消息列表),这个消息队列维护了一个待处理的消息列表,消息循环不断地从这个队列中取出消息
2021-09-01 22:53:26 405
原创 Binder跨进程机制
Binder跨进程机制传统的跨进程通信方式有很多,比如 Socket、信号量、管道、内存共享、消息队列等,这些都存在于 Linux 中。1 为什么要使用Binder?性能方面在移动设备上(性能受限制的设备,比如要省电),广泛地使用跨进程通信对通信机制的性能有严格的要求,Binder相对出传统的Socket方式,更加高效。Binder数据拷贝只需要一次,而管道、消息队列、Socket都需要2次,共享内存方式一次内存拷贝都不需要,但实现方式又比较复杂。安全方面传统的进程通信方式对于通信双方的身份并没
2021-08-25 23:32:13 298
原创 LeetCode 802. 找到最终的安全状态 [java实现]
一、问题描述在有向图中,以某个节点为起始节点,从该点出发,每一步沿着图中的一条有向边行走。如果到达的节点是终点(即它没有连出的有向边),则停止。对于一个起始节点,如果从该节点出发,无论每一步选择沿哪条有向边行走,最后必然在有限步内到达终点,则将该起始节点称作是 安全 的。返回一个由图中所有安全的起始节点组成的数组作为答案。答案数组中的元素应当按 升序 排列。该有向图有 n 个节点,按 0 到 n - 1 编号,其中 n 是 graph 的节点数。图以下述形式给出:graph[i] 是编号 j 节点的
2021-08-05 11:00:47 158
原创 LeetCode 743. 网络延迟时间 [java实现]
一、问题描述有 n 个网络节点,标记为 1 到 n。给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。 二、测试数据示例 1:输入:times = [[2,1,1],[2,3,1],[3,4,1]], n = 4, k = 2输出:2
2021-08-02 16:11:48 423
原创 Android设计模式——单例模式
单例模式单例类(Singleton)实现单例模式关键点:构造函数私有通过一个静态方法或枚举返回单例类对象确保单例类的对象有且仅有一个,特别在多线程环境下确保单例类对象在反序列化时不会重新构建对象 [ 1-4 方式都会在被反序列化时重新生成对象,必须加上如下方法:] 但枚举方法不存在这种问题。private Object readResolve() throws ObjectStreamException{ return sInstance; //返回现有对象,而不是默认重新生成
2021-08-01 17:12:24 247
原创 LeetCode 1104. 二叉树寻路 [java实现]
一、问题描述在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。如下图所示,在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。给你树上某一个节点的标号 label,请你返回从根节点到该标号为 label 节点的路径,该路径是由途经的节点标号所组成的。 二、测试数据示例 1:输入:label = 14输出:[1,3,4,14]示例 2:输入:label
2021-07-29 15:29:25 138
原创 LeetCode 863. 二叉树中所有距离为 K 的结点 [java实现]
一、问题描述给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。 二、测试数据示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2输出:[7,4,1]解释:所求结点为与目标结点(值为 5)距离为 2 的结点,值分别为 7,4,以及 1注意,输入的 "root" 和 "target
2021-07-28 16:11:24 268
原创 LeetCode 1713. 得到子序列的最少操作次数 [java实现]
一、问题描述给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素。每一次操作中,你可以在 arr 的任意位置插入任一整数。比方说,如果 arr = [1,4,1,2] ,那么你可以在中间添加 3 得到 [1,4,**3**,1,2] 。你可以在数组最开始或最后面添加整数。请你返回 最少 操作次数,使得 target 成为 arr 的一个子序列。一个数组的 子序列 指的是删除原数组的某些元素(可能一个元素都不删除),同时不改变其余元素的相对
2021-07-26 10:53:09 233
原创 LeetCode 1743. 从相邻元素对还原数组 [java实现]
一、问题描述存在一个由 n 个不同元素组成的整数数组 nums ,但你已经记不清具体内容。好在你还记得 nums 中的每一对相邻元素。给你一个二维整数数组 adjacentPairs ,大小为 n - 1 ,其中每个 adjacentPairs[i] = [ui, vi] 表示元素 ui 和 vi 在 nums 中相邻。题目数据保证所有由元素 nums[i] 和 nums[i+1] 组成的相邻元素对都存在于 adjacentPairs 中,存在形式可能是 [nums[i], nums[i+1]] ,也
2021-07-25 14:14:47 191
原创 java 泛型笔记
泛型泛型,又称参数化类型泛型类并没有自己独有的 Class 类对象。比如:并不存在 List<Object>.class 或是 List<Interger>.class,Java 编译器会将二者都视为 List.class。泛型一些约定俗成的命名:E - ElementK - KeyN - NumberT - TypeV - ValueT - 类型,主要用于表示第一类通用型参数。S - 类型,主要用于表示第二类通用类型参数。U - 类型,主要用于表示第三类通用
2021-07-20 22:17:29 256 1
原创 LeetCode 1838. 最高频元素的频数 [java实现]
一、问题描述元素的 频数 是该元素在一个数组中出现的次数。给你一个整数数组 nums 和一个整数 k 。在一步操作中,你可以选择 nums 的一个下标,并将该下标对应元素的值增加 1 。执行最多 k 次操作后,返回数组中最高频元素的 最大可能频数 。 二、测试数据示例 1:输入:nums = [1,2,4], k = 5输出:3解释:对第一个元素执行 3 次递增操作,对第二个元素执 2 次递增操作,此时 nums = [4,4,4] 。4 是数组中最高频元素,频数是 3 。 示
2021-07-19 16:26:21 207
原创 LeetCode 面试题 10.02. 变位词组 [java实现]
一、问题描述编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。 二、测试数据示例 1:输入: ["eat", "tea", "tan", "ate", "nat", "bat"],输出:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]提示:所有输入均为小写字母。不考虑答案输出的顺序。 三、解题思路利用 HashMap 键值对存储区分字符串 HashMap<Str
2021-07-18 17:24:13 203
原创 LeetCode 53. 最大子序和 [java实现]
一、问题描述给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 二、测试数据示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。示例 2:输入:nums = [1]输出:1提示:1 <= nums.length <= 3 * 104-105 <= nums[i] <= 105 三、解题思路贪心算法:
2021-07-17 15:34:11 110
原创 LeetCode 剑指 Offer 53 - I. 在排序数组中查找数字 I [java实现]
一、问题描述统计一个数字在排序数组中出现的次数。 二、测试数据示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0提示:0 <= 数组长度 <= 50000 三、解题思路 利用 二分查找找到最左边符合要求的位序找到最右边符合要求的位序//找到最左边符合要求的位序 public int binarySearchFin
2021-07-16 17:33:34 102
原创 LeetCode 1818. 绝对差值和 [java实现]
一、问题描述给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n 。数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= i < n)的 总和(下标从 0 开始)。你可以选用 nums1 中的 任意一个 元素来替换 nums1 中的 至多 一个元素,以 最小化 绝对差值和。在替换数组 nums1 中最多一个元素 之后 ,返回最小绝对差值和。因为答案可能很大,所以需要对 109 + 7 取余 后返回。|x| 定
2021-07-14 16:25:45 347
原创 LeetCode 981. 基于时间的键值存储 [java实现]
一、问题描述创建一个基于时间的键值存储类 TimeMap,它支持下面两个操作:set(string key, string value, int timestamp)存储键 key、值 value,以及给定的时间戳 timestamp。get(string key, int timestamp)返回先前调用 set(key, value, timestamp_prev) 所存储的值,其中 timestamp_prev <= timestamp。如果有多个这样的值,则返回
2021-07-10 16:34:55 151
原创 TCP/IP 笔记
TCP / IP 笔记 1. 参考模型1.1 OSI 参考模型OSI 参考模型注重 “通信协议必要的功能是什么” 应用层 :针对特定应用的协议。为应用程序提供服务并规定应用程序中通信相关的细节。 表示层 :设备固有的数据格式和网络标准格式的转换。将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式。 会话层 :通信管理。负责建立和断开通信连接,以及数据的分割等数据传输相关的管理。 传输层 :管理两个节点之间是的数据传输。负责
2021-07-06 21:21:43 206 3
原创 HTTP 笔记
HTTP 笔记《图解HTTP》相关笔记 1. HTTP 方法GET :获取资源POST :传输实体主体PUT :传输文件要求在请求报文的主体中包含文件内容,然后保存到请求 URI 的指定位置HEAD :获得报文首部用于确认 URI 的有效性一级资源更新的时间DELETE :删除文件请求 URI 删除指定的资源OPTIONS :询问支持的方法查询针对请求 URI 指定的资源支持的方法TRACE :追踪路径CONNECT :要求用
2021-07-05 23:30:02 136 1
原创 Android 实现全屏截图、剪裁图片、分享图片至其他应用进程功能(踩坑记录)
Android 实现全屏截图、剪裁、分享功能项目中需要用到 截图分享 的功能,特此写下查询资料过程中的踩坑记录。 1、全屏截图1.1 踩坑记录第一个坑:方法已被弃用(先前实现的全屏截图方法,已经在api28及以上弃用) // View是全屏截图 **已弃用** View getView = this.getWindow().getDecorView(); getView.setDrawingCacheEnabled(true); getVie
2021-05-13 16:41:09 1454 3
原创 在activity的toolbar中使用menu
在activity的toolbar中使用menu1 创建menu文件在res/menu中创建 activity_detail_menu.xml<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <
2021-05-10 20:30:55 199
原创 Kotlin实现自定义圆形ImageView
Kotlin实现自定义圆形ImageView在项目中做用户头像经常需要实现圆形头像的功能,查找资料后,实现自定义圆形ImageView效果。package com.example.customlockscreen.Utilimport android.annotation.SuppressLintimport android.content.Contextimport android.graphics.*import android.graphics.drawable.BitmapDrawab
2021-05-09 21:24:33 963
原创 LeetCode 403. 青蛙过河 [java实现]
一、问题描述 一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。给你石子的位置列表 stones(用单元格序号 升序 表示), 请判定青蛙能否成功过河(即能否在最后一步跳至最后一块石子上)。开始时, 青蛙默认已站在第一块石子上,并可以假定它第一步只能跳跃一个单位(即只能从单元格 1 跳至单元格 2 )。如果青蛙上一步跳跃了 k 个单位,那么它接下来的跳跃距离只能选择为 k - 1、k 或 k + 1 个
2021-05-05 23:11:13 183
原创 Android在数据库储存图片资源id方法
Android在数据库储存图标资源的方法问题:项目中需要存储图标资源,若数据库中直接存储图标资源id(R.mipmap.icon)显然是有风险的做法。因为每次编译应用程序时会自动生成R文件,所以每次启动时,图片资源id都可能会发生变化。即 图片资源id(int)并不是恒不变的,不能通过数据库静态储存id来获取图片。解决方法://数据库储存 String 类型{图标资源名称}var iconName:String = resources.getResourceEntryName(R.mipmap.a
2021-04-26 20:42:14 985
原创 LeetCode 363. 矩形区域不超过 K 的最大数值和 [java实现]
一、问题描述 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。 题目数据保证总会存在一个数值和不超过 k 的矩形区域。 二、测试数据示例 1:输入:matrix = [[1,0,1],[0,-2,3]], k = 2输出:2解释:蓝色边框圈出来的矩形区域 [[0, 1], [-2, 3]] 的数值和是 2,且 2 是不超过 k 的最大数字(k = 2)。示例 2:输入:matrix = [[2,2,-1]], k
2021-04-22 16:15:42 199 1
原创 LeetCode 91. 解码方法 [java实现]
一、问题描述一条包含字母 A-Z 的消息通过以下映射进行了 编码 :'A' -> 1'B' -> 2...'Z' -> 26要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“11106” 可以映射为:"AAJF" ,将消息分组为 (1 1 10 6)"KJF" ,将消息分组为 (11 10 6)注意,消息不能分组为 (1 11 06) ,因为 “06” 不能映射为 “F” ,这是由于 “6” 和 “06”
2021-04-21 16:10:05 138 1
原创 Kotlin实现沉浸式状态栏踩坑记录——图片延伸至状态栏,且不影响toolbar的占位
沉浸式状态栏实现 图片延伸至状态栏,不影响toolbar的占位 private fun steepStatusBar() { var release=Build.MODEL if (release!=null){ if (release.contains("HUAWEI")){ window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
2021-04-18 21:13:21 796 1
原创 LeetCode 220. 存在重复元素 III [java实现]
一、问题描述给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。如果存在则返回 true,不存在返回 false。 二、测试数据示例 1:输入:nums = [1,2,3,1], k = 3, t = 0输出:true示例 2:输入:nums = [1,0,1,1], k = 1, t = 2输出:true示例 3:
2021-04-18 14:37:18 176
原创 LeetCode 213. 打家劫舍 II [java实现]
一、问题描述你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,能够偷窃到的最高金额。 二、测试数据示例 1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额
2021-04-15 20:44:03 329
原创 Android的Drawable分类汇总
Drawable的分类1、bitmapDrawable表示一张图片<?xml version="1.0" encoding="utf-8"?><bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@[package:]drawable/drawable_resource" android:antialias=["true" | "false"]
2021-04-15 16:48:27 393
原创 LeetCode 208. 实现 Trie (前缀树) [java实现]
一、问题描述 Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回true(即,在检索之前已经插入);否则,返回 false 。boolean sta
2021-04-14 16:22:23 131
原创 activity获取某个View宽高的解决办法
问题在 Activity 启动后就获取这个View 的宽/高因为View的measure过程和Activity 的生命周期方法不是同步执行的,无法保证在 onCreate、onStart、onResume 时,某个 View 已经被测量完毕。 解决办法1、onWindowFocusChanged(hasFocus: Boolean)View已经初始化完毕,当 activity 的窗口得到焦点或者失去焦点时被调用(即当 activity 继续执行或者暂停执行时均会被调用) overrid
2021-04-12 22:37:16 146
原创 关于View的滑动冲突
滑动冲突场景一:外部滑动方向和内部滑动方向不一致1.1场景 ViewPager + Fragment 配合使用所组成的页面滑动效果,实现左右滑动效果,里面通常嵌套一个 ListView ,这时 ViewPager 会自动处理这种滑动冲突。 若我们没有使用 ViewPager ,就要手动处理滑动冲突 外部上下滑动、内部左右滑动1.2处理规则 根据滑动的方向来确定哪一层去拦截事件根据滑动的坐标就能确定滑动方向:滑动路径和水平方向的夹角水平方向和竖直方向的距离差:竖直方向滑动的距离
2021-04-12 22:30:14 134
原创 Android四大组件总结
四大组件 Android系统的四大组件分别是 Activity(活动)、Service(服务)、Broadcast Receiver(广播接收器)、Content Provider(内容提供器)其中,Activity 用于和用户交互;Service 后台运行服务,不提供界面呈现;Broadcast Receiver 用于接受系统广播或自定义广播;Content Provider支持多个应用中存储和读取数据,相当于数据库。 在使用四大组件时,都需要在AndroidManifest.xml 里声明相关
2021-04-12 20:45:55 561
原创 LeetCode 179. 最大数 [java实现]
一、问题描述 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。 **注意:**输出结果可能非常大,所以你需要返回一个字符串而不是整数。 二、测试数据示例 1:输入:nums = [10,2]输出:"210"示例 2:输入:nums = [3,30,34,5,9]输出:"9534330"示例 3:输入:nums = [10]输出:"10"示例 4:输入:nums = [0,0]输出:"0"提示:1 <= nums.
2021-04-12 17:14:14 209
TC2.0是一款高效快捷的编译工具软件(win xp系统可运行)
2020-02-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人