zhaonhui
码龄9年
关注
提问 私信
  • 博客:180,645
    社区:2
    问答:1,594
    182,241
    总访问量
  • 64
    原创
  • 1,943,667
    排名
  • 25
    粉丝
  • 0
    铁粉
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:河南省
  • 加入CSDN时间: 2015-11-19
博客简介:

zhaonhui的博客

查看详细资料
个人成就
  • 获得92次点赞
  • 内容获得21次评论
  • 获得206次收藏
  • 代码片获得291次分享
创作历程
  • 3篇
    2023年
  • 1篇
    2022年
  • 17篇
    2020年
  • 7篇
    2019年
  • 23篇
    2018年
  • 4篇
    2017年
  • 9篇
    2016年
成就勋章
TA的专栏
  • Flutter
    2篇
  • linux
  • Android
    51篇
  • javaweb
    5篇
  • javaSE
    3篇
  • 数据结构和算法
    1篇
  • Git
    1篇
兴趣领域 设置
  • 数据结构与算法
    数据结构
  • 移动开发
    kotlinflutterandroid studio
  • 软件工程
    性能优化
  • 学习和成长
    面试
创作活动更多

如何做好一份技术文档?

无论你是技术大神还是初涉此领域的新手,都欢迎分享你的宝贵经验、独到见解与创新方法,为技术传播之路点亮明灯!

183人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

Gradle8.0中Transform的替代方案

在Gradle插件中对HuiRouterApi进行插桩,添加插入路由信息的字节码指令,在程序运行时,插桩的字节码指令执行,路由信息被注册到HuiRouterApi内部的路由表中,然后外部就可以通过HuiRouterApi进行跳转操作了。扫描过程中,收集的路由信息记录到annotationPathMap中。5、在taskAction方法中,扫描遍历所有的jar和class文件,收集路由信息,查找到HuiRouterApi类,并将收集到的路由信息通过插桩的方式添加到HuiRouterApi中。
原创
发布博客 2023.10.16 ·
1432 阅读 ·
1 点赞 ·
0 评论 ·
1 收藏

基于Gradle8.0的插件开发

之前使用Groovy、Java 、 手动配置的方式演示了Gradle插件的整个自定义流程《自定义gradle插件》。本文使用java-gradle-plugin 和 Kotlin重新梳理下Gradle插件的自定义流程。1、新建一个Module模块hui_plugin(选择Kotlin Library)2、在hui_plugin模块的build.gradle.kts中引入“java-gradle-plugin” 和 “org.jetbrains.kotlin.jvm” 插件。
原创
发布博客 2023.10.09 ·
3343 阅读 ·
5 点赞 ·
1 评论 ·
9 收藏

Flutter的启动和渲染流程

本文结合Android平台和Flutter Framework层,以流程图的方式简要阐述Flutter启动和渲染的工作过程
原创
发布博客 2023.09.19 ·
851 阅读 ·
1 点赞 ·
2 评论 ·
3 收藏

Flutter三棵树的构建流程

Flutter三棵树的创建和关联过程
原创
发布博客 2022.11.23 ·
794 阅读 ·
1 点赞 ·
1 评论 ·
2 收藏

LiveData的使用和原理

private val mutableLiveData = MutableLiveData<String>(); override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mutableLiveData.observe(this, Obser.
原创
发布博客 2020.10.10 ·
1987 阅读 ·
2 点赞 ·
0 评论 ·
4 收藏

Lifecycle的基本使用和原理

AppCompatActivity实现了LifecycleOwner接口,该接口有一个getLifecycle()方法,实现了这个接口的类就可以作为一个被观察者,被观察者观察它生命周期。@SuppressWarnings({"WeakerAccess", "unused"})public interface LifecycleOwner { Lifecycle getLifecycle();}在AppCompatActivity中调用getLifecycle方法返回的是LifeCycle的
原创
发布博客 2020.09.26 ·
7441 阅读 ·
4 点赞 ·
0 评论 ·
13 收藏

rtmp推流服务器搭建

1、下载nginx服务器:wget http://nginx.org/download/nginx-1.19.2.tar.gz2、解压nginx服务器:tar -xvf nginx-1.19.2.tar.gz3、在github上搜索arut/nginx-rtmp-module库,并将其下载下来,下载命令如下:wget https://github.com/arut/nginx-rtmp-module/archive/v1.2.1.tar.gz4、解压下载好的nginx-rtmp-module:ta
原创
发布博客 2020.09.15 ·
692 阅读 ·
0 点赞 ·
2 评论 ·
0 收藏

AndroidStudio中CMakeLists文件的常见配置

1、在安卓的JNI开发中,CMake是一个很重要的辅助工具,CMake是一个比make更高级的编译工具,在AS2.2版本及以上,CMake取代了make工具成为了默认的native库构建工具2、CMakeLists.txt文件的一些常见命令配置#指定cmake的最低版本号cmake_minimum_required(VERSION 3.4.1)#添加一个名称为native-lib的库文件add_library( # Sets the name of the library. #设置要添加
原创
发布博客 2020.09.12 ·
1973 阅读 ·
1 点赞 ·
0 评论 ·
4 收藏

Java中的APT注解

java中常用的一些框架都使用到了注解,比如EventBus、Dragger2、Butterknife等,从这些流行框架可以看出,注解在Android中使用还是很广泛的,注解可分为运行时注解和编译期注解,运行时注解是通过反射在运行时拿到注解信息进行处理,编译期注解是在编译阶段根据注解生成相应的中间类来处理注解,因为运行时注解需要在运行时执行反射代码和注解处理逻辑,所以它的运行时性能没有编译期注解高,本文学习的注解方式就是APT编译时注解。一、创建一个名称为annotation的module单独存放自定义的
原创
发布博客 2020.08.05 ·
873 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

基于ndk-r21b编译ffmpeg-4.3.1

1、ffmpeg下载地址:http://ffmpeg.org/download.html打开下载地址选择需要的平台和版本号进行下载,下载可以先下载下来,然后在上传到linux上,也可以使用以下命令,在linux上直接下载:wget http://ffmpeg.org/releases/ffmpeg-4.3.1.tar.bz22、解压下载好的ffmpeg,解压命令如下:tar xvf ffmpeg-4.3.1.tar.bz23、解压后会生成一个解压目录ffmpeg-4.3.1,在这个目录下创建a
原创
发布博客 2020.07.31 ·
1257 阅读 ·
3 点赞 ·
3 评论 ·
6 收藏

Linux(Centos系统)上配置Tomcat

1、tomcat下载地址:https://tomcat.apache.org/download-90.cgi2、安装lrzsz用来上传和下载文件用,安装命令如下: yum -y install lrzsz3、将下载好的tomcat包上传到linux服务器的自定义目录下,windows平台下可以使用rz上传文件,sz下载文件。mac平台下可以通过如下步骤上传文件:(1)sftp -P 22 root@服务器ip地址(2)单文件上传:put 本地文件路径 服务端文件夹路径(3)批量上传文件:pu
原创
发布博客 2020.07.29 ·
284 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

Rxjava2中Single的map操作符源码学习

//注释1Single<Integer> integerSingle = Single.just(1);//注释2Single<String> stringSingle = integerSingle.map(new Function<Integer, String>() { @Override public String apply(Integer integer) { return "map:" + String.valueOf
原创
发布博客 2020.07.25 ·
532 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Rxjava2中Single的just操作符源码学习

//注释1Single<Integer> integerSingle = Single.just(1);//注释2integerSingle.subscribe(new SingleObserver<Integer>() { @Override public void onSubscribe(Disposable d) { } @Override public void onSuccess(Integer s) {
原创
发布博客 2020.07.23 ·
1314 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

dex替换方式实现热修复

加载原理:BaseDexClassLoader、DexPathList、dexElements数组、findClass等一、下载修复的dex到手机上需要修复的dex是放到服务器上的,当App启动的时候就去下载到手机上(最好存放到应用私有目录下,这样更加安全,不容易被误删除,便于加载使用)。这里为了方便就省去了下载的过程,直接将修复包放到assets目录下了。然后将assets目录下的修复包复...
原创
发布博客 2020.05.07 ·
926 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

ASM和自定义Transform的应用实践

上篇文章学习了下如何自定义gradle插件《自定义gradle》,在实际应用中一般都会结合自定义的Transform和字节码操作框架(像ASM、Javassist)通过操作字节码来实现自己的业务逻辑,Transform是Android Gradle 在1.5.0 版本后提供的, 它允许第三方的Plugin插件在打包成 dex 文件之前的编译过程中操作 class 文件,对于一些重复性的操作,程序员...
原创
发布博客 2020.05.04 ·
1395 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Android Studio3.6版本,格式化xml布局,导致错乱

将Android Studio升级到最新版3.6.3,编写完xml文件后,来了一下代码格式化,然后惊奇的发现布局全都乱套了,检查发现自己写的view控件位置发生了变化,不知道AS为什么会出现这么弱智的设计,下面说下解决问题的方法(Mac版):打开AS最上面的一行工具栏->Android Studio->PreferencesEditor->XML->Set from...
原创
发布博客 2020.04.30 ·
1076 阅读 ·
2 点赞 ·
0 评论 ·
0 收藏

自定义gradle插件

自定义gradle插件的方式有3种,第一种是直接创建build.gradle文件并在里面编写配置代码,第二种是在项目中新建一个buildSrc模块并在这个模块中编写groovy代码,第三种就是在独立的Module中编写插件,这里介绍的自定义插件采用的是第三种方式,具体的实现步骤如下:1、新建一个工程项目gradle_plugin_demo,然后在新建一个Module模块custom_plugin...
原创
发布博客 2020.04.27 ·
2644 阅读 ·
1 点赞 ·
0 评论 ·
3 收藏

自定义注解在MVP中的使用

P层添加注解
原创
发布博客 2020.04.25 ·
330 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

动态代理在MVP中的使用

动态代理
原创
发布博客 2020.04.16 ·
432 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Retrofit源码解析

一、Retrofit创建过程源码解析 mRetrofit = new Retrofit.Builder() .baseUrl(HttpConfig.BASE_URL) // 设置网络请求的Url地址 .client(mOkHttpClient) .addConverterFactory(GsonCon...
原创
发布博客 2020.03.27 ·
232 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏
加载更多