自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

renzhongrui的博客

学习与思考

  • 博客(157)
  • 资源 (7)
  • 收藏
  • 关注

原创 flutter常用命令及问题

记录flutter常用命令及问题。

2022-06-21 12:22:23 1225 1

原创 推荐一款好用的Web端JSON在线编辑器svelte-jsoneditor

今天推荐一款Web前端好用的JSON编辑器,适用于 Chrome, Firefox, Safari, Opera, Edge, Internet Explorer 11主流浏览器,并且可以使用Javascript、Vue、React开发。

2022-06-15 13:15:45 7555

原创 OkHttp使用拦截器设置全局请求头

工作中遇到了全局添加请求头的需求,如果在每个接口去加请求头,有点麻烦,所以通过OkHttp拦截器机制,拦截Request请求,来设置全局请求头。

2022-06-10 21:30:17 2881 1

原创 webview中shouldOverrideUrlLoading方法解析

在Android中使用自定义webview的时候,会重写shouldOverrideUrlLoading方法,本文就简单了解一下该方法的作用。

2022-05-30 15:04:19 5827

原创 Java实现适配器模式

定义:将一个类的接口转化成客户期望的另一个类的接口,使原本不兼容的类可以一起工作。

2022-03-25 16:45:17 1039

原创 使用ServiceLoader和AutoService实现插(组)件

ServiceLoader可以理解为是一个接口或类的加载器,通过接口或抽象类能够找到实现该接口或抽象类的子类。

2022-03-23 19:43:27 1714

原创 记录Gitlab常用API

GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。很多公司都在用Gitlab。有时候开发业务需要调用Gitlab上的一些接口,比如获取当前用户、仓库分组、工程目录、提交记录、分支、tag、readme等,下面记录一下Gitlab开放api。...

2022-03-07 23:46:46 7757 2

原创 Java实现原型模式

定义:通过创建一个原型对象,然后拷贝该原型对象来创建新的对象,新的对象与原型实例类型一致。

2022-02-27 16:00:16 560

原创 Java实现抽象工厂模式

抽象工厂模式提供一个创建一系列相关或者相互依赖对象的接口。

2022-02-25 10:11:02 2521

原创 Java实现工厂方法模式

工厂方法模式定义一个创建对象的接口,让实现该接口的子类来创建所需要的对象。

2022-02-21 23:40:58 804

原创 Android自定义九宫格手势解锁组件

本文主要介绍Java版本九宫格手势解锁组件的使用和实现原理。

2022-02-19 18:26:40 1809 1

原创 Java实现简单工厂模式

定义一个工厂类,该类提供一个静态方法,该方法会根据传入的参数的不同来创建不同的实例。特点和优点:- 工厂类中创建实例的方法是静态的,所以简单工厂模式也叫静态工厂模式- 根据传入参数的不同来获取不同的实例,不关注内部实现。缺点:- 新增或修改创建过程需要修改静态方法内部逻辑,违背开闭原则;- 工厂类集成了创建实例的所有逻辑,职责过重,异常后会影响整个模块,另外内部逻辑过于复杂,扩展性差;- 工厂类使用静态方法,造成工厂角色无法被继承。 下面以车厂造车模型来实现简单工厂模式。

2022-02-17 14:39:56 5934

原创 Java实现发布订阅模式

发布订阅模式是软件开发者很常见的一种设计模式,很多开源库都使用了发布订阅模式,例如RxJava、EventBus、Vue等,所以学习该模式还是很有必要的。该模式中存在一个或多个发布者,一个或多个订阅者,当发布者发布消息的时候,参与订阅的订阅者会收到对应的消息通知。其实核心原理就是使用一个集合来存储所有的订阅者类,当发布消息的时候遍历这个集合,并调用集合中的每一个订阅者类的通知方法。

2022-01-13 00:31:33 9424 3

原创 Java实现构建者模式

构建者模式也叫建造者或者构建者模式,是软件开发中常用的一种设计模式,它允许使用者像建造者一样把需要的属性一个一个添加进去。例如AlertDialog、OKHttp、Glide等库都使用了构建者模式。使用条件:当初始化一个类时,需要设置很多属性,这些属性有必选设置,有的是可选的。

2022-01-11 23:59:38 235

原创 Java中常见单例模式写法

单例设计模式是软件开发中常见的一种设计模式,它允许内存中只存在一个该实例的对象,优点是实例只创建一次,供全局使用,避免了频繁创建对象,节省了内存创建和销毁的性能消耗。

2022-01-11 00:03:19 391

原创 Linux交叉编译FFmpeg

基础准备在Android中使用编译好的FFmpeg,需要先了解一下C/C++编译基础概念,还需要准备一台Linux操作系统的机器。编译流程C/C++编译流程图如下:静态库和动态库本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。C和C++库有两种:静态库(.a、.lib)和动态库(.so、.dll)。windows:.lib和.dll库。Linux:.a和.so库。静态库和动态库区别:所谓静态、动态是指链接阶段,如下图所示:1、静态库在编译时链接到目标代码,运行时

2022-01-03 22:33:24 4034 2

原创 Android应用实现Https双向认证

为什么需要双向认证Https保证的是信道的安全,即客户端和服务端通信报文的安全。但是无法保证中间人攻击,所以双向认证解决的问题就是防止中间人攻击。中间人攻击(Man-in-the-MiddleAttack)简称(MITM),是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”。若没有开启双向认证,中间人可以拦截客户端发送的请求,然后篡改信息再发送到服务端;中间人也可以拦截服务端返回的信息,再发送到客户端。所

2022-01-03 18:58:47 3722 4

原创 LiveData原理解析

什么是LiveDataLiveData是Android Architecture Components 其中的一个组件。主要用于更新UI数据和组件之间传值。1、LiveData是一种持有可被观察数据的类。它通过观察者模式实现了数据变化的动态通知,即当观察者生命周期处于活跃状态时,能够感知数据的变化。2、能够感知生命周期,内部通过Lifecycle来感知生命周期,在Activity、Fragment、Service中当对应生命周期为Destroy的时候,会销毁观察者,避免内存泄露;

2021-11-21 19:12:41 4434

原创 APT技术在Android中的使用

APT技术在Android中的使用APT全称 Annotation Process Tool,是Java提供的注解处理工具,能够帮助开发者在编译阶段生成所需要的可执行代码。在Android开发中,著名的ButterKnife、Dagger2、ARouter都是使用了APT技术,所以作为一名Android开发者,还是有必要了解一下APT技术的使用。Android中使用APT在Android工程中使用APT,首先需要创建两个Java Module,一个是annotation(注解module,也可以是A

2021-11-07 16:39:58 4016

原创 轻松搞定应用启动黑白屏

启动白屏现象随着应用体积越来越大,初始化的时候做的事情越来越多,应用在启动的时候,往往会出现一个短暂的白屏现象,对于用户来说体验非常不好,如下图所示:为什么会出现启动白屏?先做个测试:在MainActivity的onCreate方法中,在调用setContentView设置布局前,让延迟执行2秒中,则会出现白屏现象。@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInsta

2021-07-10 15:26:07 858

原创 Jetpack Security的使用

Jetpack 是一套组件库,可帮助开发人员遵循最佳实践,减少样板代码并编写可在 Android 版本和设备上一致工作的代码,以便开发人员可以专注于他们关心的代码。Jetpack Security是其中一个组件,该 库提供了与读取和写入静态数据以及密钥创建和验证相关的[安全最佳做法]

2021-06-15 12:56:20 766 1

原创 SharedPreferences原理解析

SharedPreferences介绍SharedPreferences是Android官方的Key-Value键值对形式的轻量级存储方式,能够存储少量的数据,支持基本类型、字符串类型。文件存储路径是/data/data/应用程序包名/shared_prefs。SharedPreferences使用1、创建SharedPreferencesSharedPreferences getSharedPreferences(String name, @PreferencesMode int mode);

2021-06-08 18:01:26 938 1

原创 Android10.0和11.0唯一识别标识设计

应用开发中不管是埋点统计还是推送通知,都会用到唯一识别标识,在Android中设备唯一码有很多,如:MAC地址、IMEI号(DeviceId)、IMSI号、ANDROID_ID、序列号(SerialNumber)等,但并不是所有设备上都能稳定获取到这些值。在10.0以前这些值还能获取到,Mac地址6.0之后通过api是获取不到的,通过扫描硬件端口还能获取,但是10.0之后,这些唯一识别标识都被Android官方禁用了,Mac地址会返回一个虚假的值。

2021-01-22 18:52:02 6079 10

原创 Java线程池原理解析

线程的消耗1、其实 Java 中的线程模型是基于操作系统原生线程模型实现的,也就是说 Java 中的线程其实是基于内核线程实现的,线程的创建,析构与同步都需要进行系统调用,而系统调用需要在用户态与内核中来回切换,代价相对较高,线程的生命周期耗时包括「线程创建时间」,「线程执行任务时间」,「线程销毁时间」,创建和销毁都需要导致系统调用;2、每个 Thread 都需要有一个内核线程的支持,也就意味着每个 Thread 都需要消耗一定的内核资源(如内核线程的栈空间),因此能创建的 Thread 是有限的;3

2021-01-20 15:15:09 321

原创 Java线程池的使用

线程池(ThreadPool)是一种多线程处理形式,也就是线程的一种使用模式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。

2021-01-08 15:41:30 480

原创 Glide源码解析(3)—缓存加载机制

前言在《Glide源码解析(1)—图片加载流程》一文中主要分析了Glide如何从网络下载并设置到ImageView上加载流程。在《Glide源码解析(2)—Glide实例创建过程》一文中主要分析了Glide的创建流程,包括内存缓存和磁盘缓存的初始化。其中缓存加载机制并没有过多分析,本文就专门分析一下Glide中缓存的加载流程是如何设计的。设置缓存Glide.with(this) .load("https://url") .diskCacheStrategy(DiskCacheStr

2020-12-17 13:25:39 803

原创 Glide源码解析(2)—Glide实例创建过程

Glide的使用很简单,就在这简单的三步中就实现了很多复杂的流程,其中就包括Glide的创建,Glide的创建涉及的内容很多,下面就开始分析Glide的创建过程。...

2020-12-16 17:58:43 295

原创 Glide源码解析(1)—图片加载流程

Glide加载一张图片Glide源码地址:https://github.com/bumptech/glide

2020-12-11 01:13:03 273

原创 Java代码获取工程路径

Java代码获取工程路径:System.getProperty("user.dir")

2020-10-26 10:56:37 273

原创 Android10.0应用图标隐藏方案(7.0-10.0)

Android7.0 - 10.0应用图标隐藏方案

2020-09-23 15:21:03 9282 8

原创 Framwork源码解析(5)—Activity启动流程(8.0)

调用startActivity启动Activity流程1、 调用启动方法;Intent intent = new Intent();intent.setClassName("packageName","className");startActivity(intent);2、进入Activity类的startActivity方法,@Overridepublic void startActivity(Intent intent) { this.startActivity(intent,

2020-08-25 03:20:10 504

原创 Framwork源码解析(4)_ActivityManagerService(AMS)启动流程(8.0)

ActivityManagerService简介ActivityManagerService简称AMS,具有管理Activity行为、控制Activity的生命周期、派发消息事件、内存管理等功能。查看AMS源码之前一定要先看一下前文System_Server进程启动过程:https://blog.csdn.net/u010982507/article/details/104123531以下源码为8.0系统。AMS启动入口从上文中的system_server进程启动流程分析中可以得知,在SystemS

2020-08-24 15:26:24 321

原创 Binder机制原理学习笔记(4)_ServiceManager启动Binder分析

在[Framwork源码解析(1)_Zygote进程启动流程](https://blog.csdn.net/u010982507/article/details/104109945)一文中了解过,Android系统启动Zygote进程然后创建SystemService,再创建其他服务进程,ServiceManager 进程也是在这里启动的。查看`/system/core/rootdir/init.rc`源码,可以找到启动servicemanager

2020-06-24 18:36:51 221

原创 Binder机制原理学习笔记(3)_Binder机制整体架构和通信流程

Binder整体架构Binder 通信采用 C/S 架构,核心包含 Client、 Server、 ServiceManager 以及 Binder 驱动。其中Server,Client,ServiceManager 运行于用户空间,驱动运行于内核空间。ServiceManager 用于管理系统中的各种服务。Binder使用了面向对象的思想来描述作为访问接入点的Binder及其在Client中的入口:Binder是一个实体位于Server中的对象,该对象提供了一套方法用以实现对服务的请求,就象类的成员

2020-06-24 18:20:49 324

原创 Binder机制原理学习笔记(2)_Binder一次Copy原理

Binder 是基于 C/S 架构的。由一系列的组件组成,包括 Client、Server、ServiceManager、Binder 驱动。其中 Client、Server、Service Manager 运行在用户空间,Binder 驱动运行在内核空间。其中 Service Manager 和 Binder 驱动由系统提供,而 Client、Server 由应用程序来实现。Client、Server 和 ServiceManager 均是通过系统调用函数 open、mmap 和 ioctl 来访问

2020-06-22 09:02:09 1052

原创 Binder机制原理学习笔记(1)_了解IPC通信及Binder

进程间通信(IPC,Inter-Process Communication)指至少两个进程或线程间传送数据或信号的一些技术或方法。进程是计算机系统分配资源的最小单位(进程是分配资源最小的单位,而线程是调度的最小单位,线程共用进程资源)。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。

2020-06-21 22:56:24 332

原创 Gradle+bootJar打包SpringBoot工程并分离jar包和配置文件

Gradle+bootJar打包SpringBoot工程并分离jar包和配置文件

2020-06-01 15:37:31 17541 48

原创 Web系统开发技术演进

简介Web 开发技术一直在不断发展,各种新的技术层出不穷。但是技术发展的本质是不变的,就是为了不断提高生产效率、创造更好的产品和服务和解决更多更难的问题。发展历程1. 静态页面最初的web系统开发,只是简单的页面展示功能,采用html+css+js技术编写静态html页面,然后放置到服务器上,通过访问页面的url来在浏览器上展示文字和图片。缺点很明显,无法动态改变页面内容。2. 动态页面(前后端不分离)为了动态改变页面内容,随后出现了PHP、JSP、ASP等动态页面技术,可以将脚本嵌入到页面中,

2020-05-24 00:26:45 1261

原创 elasticsearch启停shell脚本

#!/bin/bashES_HOME=/home/elk/elasticsearch-7.3.2APP_NAME=elasticsearchecho "开始启停elasticsearch"# 使用方式usage() { echo "case:sh run.sh [start | stop | restart | status]" echo "请类似这样执行 ./*.sh start...

2020-05-05 13:56:46 1006

原创 安装elasticsearch遇到的坑

1、:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]elasticsearch启动时遇到的错误,意思是:elasticsearch用户拥有的内存权限太小,至少需要262144。解决:切换到root用户执行命令:sysctl -w vm.max_map_co...

2020-05-05 13:22:28 715

spring boot jar包应用启动脚本

spring boot jar包应用启动脚本

2019-08-19

webview证书校验,获取证书sha256值

webview证书校验,获取证书sha256值

2019-01-09

Https双向认证工具类

Https双向认证工具类

2019-01-08

Https单向认证忽略证书工具类

Https单向认证忽略证书工具类,自定义TrustManager和HostnameVerifier,适用于OkHttp和HttpURLConnection

2018-12-27

Android图片裁剪

自定义view图片和裁剪功能源码,博客地址https://blog.csdn.net/u010982507/article/details/81211920#comments

2018-12-05

git分支管理文档

git分支管理文档git分支管理文档git分支管理文档git分支管理文档git分支管理文档

2017-10-09

生产者消费者模型示例源码

生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。

2015-07-23

空空如也

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

TA关注的人

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