- 博客(801)
- 资源 (81)
- 收藏
- 关注
原创 【Android】Hilt比Android好在哪里
Hilt框架的功能和设计理念,和Dagger基本是完全一致的,Hilt也是完全在Dagger基础上进行开发的。但是Dagger的用法比较繁琐,Hilt主要是做了便用性上的改进,主要有以下点。
2023-11-21 19:14:25
281
原创 【Android】Dagger2 通过 AndroidInjector 简化模版代码
前面我们已经详细讲解过,如何通过 Component 和 Module 向 Activity 注入对象这是基本的使用方法,它的缺点是当 Activity 特别多时,就需要非常多的 Component 和 Module 类现在我们来讲解,如何通过 AndroidInjector 向基类进行统一注入。
2023-11-15 09:59:30
141
原创 【Android】Dagger2 框架设计理念和使用方式详解
现在我们已经知道,可以通过@Singleton来实现全局单例那么如果我们想在实现在某个类里面单例共享,不同类之间允许多例,要怎么做呢我们可以通过 Dagger 的自定义 Scope 特性来实现这个目标,步骤如下首先,自定义一个注解,表示被标记的类在里面是单例共享的Retention;Scope;@Scope实际上,@Singleton和一样,只是一个被@Scope标记的自定义注解,用来标记单例作用域的下一步,指定 Component 的作用域。
2023-11-08 09:53:07
150
原创 【Android】Lombok for Android Studio 离线插件
File - Settings - Plugins - 设置按钮 - Install Plugin from Disk - 选择插件包。
2023-11-07 22:42:55
979
原创 【Android】Debug时禁用主线程ANR限制
ANR全称Application Not Response,指主线程超过5s无响应,应用会自动退出。这样调试起来会非常麻烦,其实对于Debug应用,是可以临时禁用ANR限制的,方法如下。由于这个线程,如果我们给主线程加了断点,就会触发ANR,导致调试时应用退出。
2023-11-07 15:18:49
127
原创 【RxJava】map过程中各个Observable生命周期分析
发生异常时,所有的OnSubscribe都会执行发生异常时,所有的OnFinally都会执行发生异常时,所有的OnComplete都不会执行发生异常时,后续的OnError都会执行发生异常时,后续的OnNext都不会执行发生异常时,后续的Function都不会执行。
2023-11-01 12:26:22
1059
8
原创 当catch或finally内部发生异常
我们都知道,try-catch-finally块是用来处理异常的,finally块正常会在try块或catch块执行完毕后执行但是如果catch块内部再发生异常呢,finally块还能不能正常执行如果finally块内部也发生异常呢,会发生什么。
2023-11-01 11:53:20
384
4
原创 Git工作原理和常见问题处理方案
在单人开发、单版本开发的情景下,Git的版本记录是一个链表结构,版本要么新增,要么回退在多人开发、多个子功能同时开发、不同版本之间需要进行功能合并的情景下,链表结构的版本管理便无法再满足需求于是便诞生了树结构的版本管理方式,版本号允许新开分支进行单独的版本管理,而不影响主分支版本需要合并不同分支功能的时候,允许不同分支之间进行代码合并。
2023-10-31 10:45:35
237
1
原创 【Android】Handler为什么会造成内存泄漏
而ThreadLocal是一个static final变量,它是GC Root节点,永远不会被释放。比如我们在Activity中通过以下方式创建Handler。所以被其间接引用的Activity,也不会被释放。那么,Handler将持有Activity。在java中,匿名内部类会持有外部类引用。首先,要明确一个知识点。
2023-09-19 11:47:30
250
原创 【Java】什么是GC Root节点
GC Root节点是指在JVM中永远存活,不会被释放的对象。被GC Root节点直接或间接引用的对象,是不能被释放的。不被任何GC Root节点引用的对象,则可以被释放。GC Root节点包含以下几类。
2023-09-19 11:33:16
110
原创 【Android】性能优化方案汇总
Fragment等多页布局,页面展示时再初始化,不要一次性初始化(加快UI启动速度)用启动图片作为背景,取代默认的白色空白出口(让启动在视觉上看起来更流畅)将消耗大的工作放到子线程中初始化,并降低线程优先级(减轻UI线程压力)监测网络请求(Profiler、Wireshark、Fiddler)利用闪屏页面的展示时间处理初始化工作(让启动在视觉上看起来更流畅)布局延迟加载(可以使用ViewStub占位,需要时再加载)图片压缩(可通过tinypng网站在线压缩)将不紧急的工作延时执行(加快UI启动速度)
2023-09-06 18:18:14
154
原创 【Android】ARouter新手快速入门
ARouter的核心功能在于,它以路径访问的方式,来取代类直接访问的方式,来实现界面跳转功能,从而达到了模块间代码解耦的目的。在大型的模块化项目中,一个模块,往往无法直接访问到其它模块中的类,必须通过其它方式来完成模块间的调用。ARouter提供了一个服务类,允许我们在跳转前,做一些预处理工作。注意,这个预处理服务是对所有跳转任务都有效的,无关path。ARouter允许根据实现类的路径,自动装载一个接口实例。也可以通过ARouter直接实例化一个对象。通过以下链接,就可以直接访问对应的组件。
2023-08-31 16:41:26
510
原创 【Android】模块化方案
这个接口定义大业务从哪个界面开始启动,启动前要创建哪些资源,如何退出模块,退出时要销毁哪些资源。业务规范模块:负责登录,升级,定位,权限申请等单个子业务。当业务比较复杂时,该模块只定义接口规范,不负责具体实现。大业务模块:负责公司某个具体方向的大业务。业务配置模块:配置启用哪些业务模块,选择哪种业务方案。主模块:一个套壳模块,什么都不做,根据配置模块决定启动后哪个大业务模块。通用技术模块:负责网络通信,事件订阅发布,常用控件等通用技术方案。定制技术模块:负责播放器,视频通话,表格读写等定制技术方案。
2023-08-28 20:29:37
136
原创 【Android】JUnit和Espresso单元测试新手快速入门
Android单元测试,特别是Espresso框架,依赖于Gradle插件和SDK版本。Gradle插件版本不兼容,SDK版本不兼容,手机不支持时,单元测试都可能会执行失败。测试任务执行完毕,会在app/build/reports目录下生成测试报告。点击被Test标注的方法,左侧的运行按钮,就可以执行测试任务。点击被Test标注的方法,左侧的运行按钮,就可以执行测试任务。可能会遇到的意外比较多,如果不幸遇坑,需要靠自己去耐心尝试。报告会统计所有测试任务的执行结果,已经通过率。
2023-08-23 17:44:54
555
原创 【版本管理】Git新手快速入门
下载和安装GitHub Desktop(这个是GitHub官方的桌面客户端,但也支持任意标准的Git仓库)打开Gitee官网,https://gitee.com,注册账号,绑定手机和微信(方便以后使用)网上的教程,讲了太多高级用法和设计理念,反而把最基本的东西搞复杂了。其实Git本身是个非常简单的东西,大家平时用的主要都是其核心功能。点击Fetch Origin,将在线仓库代码拉到本地。点击Push Origin,将本地改动提交到在线仓库。编辑.gitignore配置文件,设置要忽略的文件。
2023-08-17 17:00:44
139
原创 【Android】Room新手快速入门
它类似于GreenDao,但比GreenDao更加简洁高效,是官方推荐使用的数据库框架。Room是Google推出的一款android平台上的ORM数据库框架。
2023-08-16 23:02:11
366
原创 【Android】Dagger和Hilt新手快速入门
如果需要在某个作用域内共享对象,可以在类名上添加作用域注解,如@Singleton,@ActivityScoped,@ViewScoped等。如果希望注入对象,在其子组件中重新注入仍然生效,可以通过@Module注解定义一个专门的模块类。Module类中,Method上的作用域注解,和InstallIn指定的组件,范围必须对应。Module类中用于生产对象的方法,需要添加作用域注解,和@Provides注解。通过注解生成的方式,来取代手动创建对象的方式,来管理对象和其作用域。
2023-08-16 15:53:12
763
原创 【Android】MVC,MVP,MVVM三种架构模式的区别
MVP架构规定,Model层和View层不能直接通信,要通过Presenter层进行调度,这样就实现了Model层和View层的解耦。同时,MVP架构还规定,Model层、View层、Presenter层必须通过接口进行交互,这样就明确了每层的功能定位。MVP是接口化编程风格,而MVVM是响应式编程风格,它们是两种不同的东西,适合各自的场景,并不是好与坏,谁取代谁的关系。传统的代码架构模式,仅仅是对代码进行了分层,其中的C代表Controller,控制的意思。它主要在以下两方面进行了改进:解耦,接口化。
2023-08-10 16:32:56
799
原创 【Android】ViewBinding+DataBinding+MVVM新手快速上手
在Activity中,通过ViewModel订阅DataRepository处理结果,处理结果可以通过LiveData或RxJava来订阅。使用ViewBinding,需要在gradle脚本中开启ViewBinding特性,编译时会自动生成Layout对应的Binding对象。在xml中,通过layout标签+data标签+变量表达式的方式,来让控件与ViewModel中的值绑定。ViewModel是一个特殊的数值容器,它可以与布局中的控件进行双向绑定,从而实现数值自动同步。
2023-08-09 10:30:36
687
原创 【Android】Retrofit2和RxJava2新手快速上手
网上关于Retrofit2和RxJava2的博客特别多,但是内容特别复杂,一上来就讲解很高级的用法。所以这篇博客的主要目的,只是为了讲解一下核心用法,对于不求甚解的新手来说,看完基本已经够用了。因为博客本身是脱离具体应用环境的,很难通过文字把每个点讲得透彻,大可不必太过追求面面俱到。observeOn 指定接收事件的线程,这里是网络请求执行成功,处理回复数据的线程。subscribeOn 指定订阅事件的线程,这里是执行网络请求的线程。onSubscribe 事件被订阅,这里是即将开始执行网络请求。
2023-08-04 09:51:39
478
原创 【FFMPEG】AVFilter使用流程
为了实现⼀个滤波过程,可能会需要多个滤波器协同完成,即⼀个滤波器的输出可能会是另⼀个滤波器的输⼊,AVFilterLink的作⽤是串联两个相邻的滤波器实例,形成两个滤波器之间的通道。AVFilterPad 滤波器的输⼊输出端⼝,⼀个滤波器可以有多个输⼊以及多个输出端⼝,相邻滤波器之间是通过AVFilterLink来串联的,⽽位于AVFilterLink两端的分别就是前⼀个滤波器的输出端⼝以及后⼀个滤波器的输⼊端⼝。AVFilterGraph ⽤于统合这整个滤波过程的结构体。
2023-07-06 11:32:19
720
原创 【Java】【NIO】【04】通过SocketChannel读写Socket
【代码】【Java】【NIO】【04】通过SocketChannel读写Socket。
2023-03-25 14:58:25
254
原创 【Java】【NIO】【03】通过FileChannel读写文件
这里通过一个将文件src拷贝到文件dst的Demo,来延时FileChannel是如何进行读写的。
2023-03-24 11:54:34
201
原创 【Java】【NIO】【02】Buffer工作原理
mark:标记当前position所在位置,通过reset可以将position再次恢复到标记位置。Buffer的本质是对字节数组的一种封装,只是对字节数组增加了许多常用操作的API。下面讲解,Buffer是如何通过不同参数的组合,来实现不同的读写操作的。Buffer主要通过以下几个参数,来实现读写双向操作的。capacity:最大容量,初始化时指定的数组长度。position:读写数据的起始位置。limit:数据访问的最大位置。
2023-03-24 11:51:01
233
原创 【Java】【NIO】【01】NIO设计理念
它是Java1.4之后推出来的一套非阻塞式IO接口,用于解决高并发,提升IO性能。NIO中的N,既有New的含义,也有Non-blocking的含义。NIO主要的改变在于以下几点。
2023-03-24 10:09:12
112
原创 【FFMPEG】av_samples_alloc_array_and_samples函数解析
linesize,输出参数,单帧数据最大的字节数,linesize=通道数×每个通道的样本数×采样深度。该函数用于开辟一块内存,用于存储单帧的音频数据,参数作用主要如下。audio_data,输出参数,分配的内存空间。nb_samples,每帧样本数。nb_channels,通道数。sample_fmt,样本格式。align,字节对齐,填0即可。
2023-01-07 18:03:16
572
原创 【并发编程】java.util.concurrent包下的并发类详解
CAS机制在更新数值前,先判断当前值有没有发生变化,如果数值发生了改变,则放弃当前操作,重新再尝试一次。再检查数据版本号,判断读取时数据是否被修改,如果被修改则使用悲观读的方式,加锁重新读取。数据版本号机制是在硬件层面实现的,它能绝对保证操作的原子性,不会因为代码并发而出现错误。这些类的API,可以保证数值的获取和自增操作是原子性的,不会因为并发而出现非预期的结果。ReadWriteLock在读的过程中,是不允许写操作的,是一种悲观锁。允许同时读,但写的过程中,不允许其它线程读或写。
2023-01-06 09:37:28
584
原创 【FFMPEG】AVERROR(EAGAIN)含义
继续调用avcodec_send_packet发送数据,直到解码数据足够为止。而是代表解码数据不足,需要提供更多的AVPacket才能解码出数据。这是一个常见的错误码,它实际上并不是真的报错。
2022-12-21 14:33:15
1196
原创 【后台定位】Android13后台定位方案
这个每个型号的手机,就都有所不同了,但整体上都围绕下面几个方面,只能靠大家去摸索了。一些特殊功能都有了自己的方案,虽然操作起来比较麻烦,但总算是有比较统一的方法了。在一些比较宽松的手机上,已经足够保证程序在一段时间内,能够在后台获取定位了。服务只有以前台服务的形式进行启动,才能在应用切换到后台后,继续进行定位。但不少第三方的系统,为了节约电量和性能,还必须额外进行一些保活设置。这里我们要前台定位和后台定位权限一起申请,并且将前台权限放在前面。到此为此,我们已经完成了所有必要的设置。
2022-12-14 18:29:11
3447
原创 【C++】Dll的Release版本和Debug版本不能混用
std::string和std::vector,在release和debug下的实现方式是不同的,内存使用情况也不一致。在Release模式下,程序可以正常运行,在Debug模式下,程序报内存错误,可能会出现以下两种错误。如果debug版本的exe,使用了release版本的dll,则有可能导致内存错误。因此,如果dll使用了std库,则必须保证dll和exe是使用相同规则编译出来的。C语言确实有很多比较麻烦的地方,大家只能靠经验去解决。
2022-11-27 10:34:40
1349
原创 【C++】指针什么时候必须delete,什么时候可以不delete
栈中的变量,是由程序自动进行管理的,当变量作用域结束后,程序就会自动释放,因此其内存区域不需要手动delete。所以,栈和堆的设计,是为了保证程序调度能高效的进行,像函数调用这种,在程序中是无时不刻都在进行的,必须保证效率。除了存放大型数据,堆的另一个作用,是可以数据共享,多个函数中的指针,可以访问同一份数据。堆和指针的设计,就是为了把栈中不必要的数据,单独放到一个垃圾堆中去,从而保证栈的高效。像数组,大的内存区域,复杂对象,我们则会通过new或malloc的方式,存到堆内存中。
2022-11-20 17:49:29
2707
Dagger2完整用法Demo.zip
2023-11-08
tensor-flow-lite-android-handwritten-digit-classifier.zip
2023-11-01
webrtc-m89-android.7z
2022-04-26
CH34xMultiUART.zip
2022-01-08
ONVIF JAVA SDK.zip
2021-12-18
音视频开发工资真的高吗
2022-12-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人