自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(140)
  • 资源 (8)
  • 收藏
  • 关注

原创 Android 带html标签文本添加自定义超链接跳转

这里主要做了一个简单的封装,关键点在于重写的onCLick方法,它的方法中则可以修改超链接的一些属性,比如字体颜色,下划线等//点击事件//要打开的网址//超链接颜色//超链接默认字体颜色;//点击事件//要打开的网址//超链接颜色@Override= null) {//处理点击事件TextUtils.isEmpty(mUrl)) {//如果没有设置,则看是否有设置url= null) {//有的话则使用系统浏览器跳转。

2024-03-23 12:27:41 540

原创 Android 插件化小结

插件化可以用于让apk不经过安装而运行起来,将一些不常用的模块做成插件,当需要用到时再下载运行,这可以减小主app安装包的大小,在开发过程中也可以单独调试某个插件模块,避免整个项目太大编译运行太慢问题;常见的插件化框架有:dynamic-load-apk、VirtualApp、RePlugin、shadow等。

2023-04-05 12:11:43 635 1

原创 Android 热修复小结

实现原理:将需要修复的类打包成dex补丁文件客户端下载补丁包后,在下次app启动时检测到补丁包进行加载在类加载器中会将加载的dex保存到一个数组里pathList:DexPathList,由于双亲委托机制,如果数组前面的dex文件已经包含需要加载的类,则不会从后面的dex中查找该类所以应用启动时会将补丁包通过反射调用makePathElements方法,生成一个新的数组,然后与旧的dex数组合并,将补丁包的dex放到数组前面,这样就会优先加载修复后的类。

2023-04-05 12:09:46 567

原创 Android动态换肤框架实现小结

减少APK体积不需要更新apk就可以更新皮肤可以实时更换皮肤。

2023-04-05 12:08:02 789

原创 红黑树RBT(Read Black Tree)小结

在二叉查找树的基础上,通过平衡左右两边子树的高度,从而限制整个树的高度。如果插入元素后,它的父节点是红色,但是父节点的兄弟为空或者为黑色。如果插入后父亲是红色的,但是父亲的兄弟不存在或者是黑色的。如果插入元素后,它的父结点和父结点的兄弟都是红色的。LR型:左孩子的右子树上插入结点,先左旋,后右旋。RL型:右孩子的左子树上插入结点,先右旋,后左旋。如果插入的是第一个根元素,则标记为黑色,结束。如果插入后父亲是黑色的,则不需要处理,结束。如果插入元素后,它的父结点是黑色的,则结束。

2023-04-04 22:31:11 442

原创 LinkedHashMap源码分析以及LRU的应用

LinkedHashMap我们都知道是在HashMap的基础上,保证了元素添加时的顺序;除此之外,它还支持LRU可以当做缓存中心使用。

2023-04-04 22:07:40 760

原创 HashMap源码分析小结

HashMap是以键值对的形式存储数据,内部是通过数组+链表结构实现,在1.7之后的版本,链表结构可以升级为红黑树,提高查询效率。

2023-04-04 22:04:25 583

原创 Android消息机制-Handler小结

Epoll机制是Linux系统中用于IO多路并发的机制,它通过对FD文件进行注册监听,当FD文件的可读可写状态发生改变的时候,会唤醒阻塞的应用线程并调用回调函数达到通知的目的;它相比poll和socket等机制,使用红黑树来保存fd文件节点,使得查找节点时的效率高了很多,而且它通过注册回调函数的方式,使得用户层和内核层之间拷贝的次数减少了sleep 5秒后延迟5秒的消息会立刻执行,接着再过5秒,延迟10秒的消息会执行。

2023-04-04 22:04:01 1387

原创 Android 五种启动模式小结

ActivityRecord对应着一个Activity实例,保存了Activity所有相关信息TaskRecord指的是一个任务栈,里面包含多个ActivityRecordActivityStack用于管理TaskRecord。

2023-04-04 22:02:48 964

原创 RecycleView小结

RecycleView四级缓存一级缓存:用于存放当前屏幕可显示区域的ViewHolder,目的是为了方便更新数据,以及对View操作时更加快捷二级缓存:用于缓存最近滑动出屏幕的ViewHolder,目的是为了当用户将该View滑出屏幕外时又突然滑回来时能够快速显示,最多能缓存2个ViewHolder,不需要重新绑定数据,只有当postion相同时才能匹配上三级缓存:用户自定义的缓存,一般比较少用上四级缓存:用于缓存其他滑出屏幕外的ViewHolder,每种类型的ViewHolder最多5个Re

2023-04-04 22:02:10 955

原创 Android系统启动过程小结

init进程主要用于启动和守护系统关键服务,比如:网络、通话相关服务、Zygote进程、ServiceManager等等它是通过解析init.rc文件来启动这些系统关键服务init进程是1号进程,属于第一个用户进程,0号进程是内核进程。

2023-04-04 22:01:50 499

原创 Android Binder小结

物理地址就是内存条的真实地址,虚拟地址是MMU内存管理单元出来之后才有的,虚拟地址是给cpu用的,cpu不能通过虚拟地址直接访问内存,需要通过MMU转换后才能访问到真实的物理内存;

2023-04-04 22:00:36 651

原创 Android事件分发机制小结

当手指触摸屏幕时,linux会将触摸信号记录到dev/input目录下的文件中IMS底层会开启两个线程:InputReaderThread和InputDispatcherThreadViewRootImpl在setView的时候,会创建InputChannel,通过WindowManager传递给IMS,IMS通过这个InputChannel向APP进程发送触摸事件;当ViewRootImpl这边接收到IMS那边发送过来的一个触摸事件后,最终会调用Activity的dispatchTouchEvent;

2023-04-04 21:58:20 681

原创 Android编舞者类Choreographer小结

编舞者类的作用主要是控制绘制节奏,用于发起一次vsync垂直同步信号的监听,当垂直同步信号来的时候会回调注册的Runnable或者FramCallback。

2023-04-01 21:36:26 868

原创 OkHttp小结

用户自定义拦截器:用于普通网络请求,比如用于打印Log的拦截器重试和重定向拦截器RetryAndFollowUpInterceptor:用于请求失败或者重定向时重新发起请求,最大重新发起请求次数是20桥接拦截器BridegeInterceptor:处理请求头和响应头信息的封装缓存拦截器CacheInterceptor:用于处理请求结果缓存,判断是否使用缓存以及更新缓存等;缓存策略主要分为两种:一种存在客户端的缓存,只要缓存没过期则复用;

2023-04-01 21:19:31 743

原创 Glide小结

Glide加载主要分为三个阶段,分别是在调用with、load、into方法的时候在with方法中,Glide会初始化各种资源,比如请求管理器、缓存、生命周期监听等在load方法中,会创建请求加载任务,然后封装各种请求参数在into方法中,开始真正加载图片,加载图片会先从当前活动内存中查找,没找到再从LRU内存缓存中找,最后再通过网络等原始路径去获取图片,获取到图片之后会对它进行解码转换等处理,然后会缓存到本地以及内存当中,最终显示出来。

2023-04-01 21:18:41 587

原创 Retrofit源码分析&小结

Retrofit是对Okhttp网络请求的二次封装,通过注解+动态代理的方式,简化了Okhttp的使用,使得通过简单的配置就可以像调用接口一样去请求网络接口;除此之外Retrofit还支持RxJava和kotlin的协程。

2023-04-01 21:17:45 1081

原创 网络优化小结

OSI简称Open System Intercnnect,开放式系统互联,是一个国际互联网标准制定的一个组织应用层实际应用场景,比如 浏览器、文件传输、电子邮件、文件服务、虚拟终端等;http、FTP、ssh等表示层会话层传输层网络层数据链路层物理层。

2023-04-01 21:14:04 736

原创 启动优化小结

一个是从视觉上优化通过设置主题让启动窗口显示logo图,让用户从视觉上觉得app已经启动了;一般app启动后会先展示广告界面,广告界面展示的时间可以根据启动的时间来决定显示多久,避免低端机因为启动慢而导致进入主界面时间过长另一个是从代码上优化减少主线程的一些耗时操作比如Application中初始化的第三方框架,可以进行延迟、异步并行加载对于有依赖关系的任务,可以通过有向无环图和拓扑排序配合线程池和JUC闭锁(CountDownLatch)进行优化对布局进行优化,减少View绘制时间。

2023-04-01 21:10:45 412

原创 内存优化小结

内存主要有三大问题:内存溢出、内存泄露、内存抖动;内存问题轻则会导致应用卡顿,重则导致应用崩溃。

2023-04-01 21:10:06 731

原创 崩溃优化小结

当有异常没有在代码中捕获到时,JVM会帮我们调用方法在这个方法中会判断有没有设置;如果有则让它调用方法处理异常;如果没有则使用默认的异常处理器进行处理在app进程刚创建的时候,(RuntimeInit.java)会给线程设置一个默认的异常处理器,这个默认异常处理器会将异常信息上报AMS,然后杀死app进程。

2023-04-01 21:06:47 90

原创 卡顿优化小结

卡顿的本质是因为一次垂直同步信号来的时候,当前帧要显示的图像数据还没准备好,只能等待16ms下一次垂直同步信号来时才能更新画面,在这段时间里显示器只能一直停留在上一帧的画面,如果跳过的帧数过多,就会看到上一帧的画面一直没有变化,给人的感觉就是卡顿;垂直同步信号:是为了解决显示器刷新率和CPU/GPU生产图形数据速度不匹配问题;当CPU/GPU制造图形数据的速度大于显示器刷新速度时,生产的很多帧数据就浪费了,浪费了cpu/GPU的性能;

2023-04-01 21:06:37 1054

原创 APK优化小结

减少apk大小主要从代码、图片、so库、其他资源等方面进行优化;首先我们可以通过Gradle配置开启代码混淆(minifyEnabled)和资源压缩(shrinkResources)功能;这个配置可以在打包时将项目中无用的代码和资源删除,所谓的删除不是真正的删除,而是将资源内容清空然后可以将不需要的平台so库以及语言资源通过配置不打进apk包中splits:打特定包在图片方面:我们可以使用占用空间更小的图片格式,比如webp、svg等非必要的图片不要内置app,而是通过网络下载到本地后再显示。

2023-04-01 21:02:06 536

原创 Unresolved reference: synthetic 【Android】【Android Studio】【kotlin-android-extensions】

这个插件已经过时了,之前还只是警告,现在完全不能用了,Google推荐我们使用。这个类了,又看了下kotlin扩展包下面确实没这个类了。网上找了一圈基本都是教我们怎么使用,让我们导入。

2022-10-26 07:14:18 1911

原创 手写Rxjava了解核心实现原理

RxJava将观察者模式运用到了极致,使得通过一些简单的操作符就可以实现诸如线程切换、过滤、转换等复杂的业务流程,并通过链式调用保持了代码的可读性和简洁性链式调用是通过在每一个操作符中都返回一个新的被观察者Observable实现每一个操作符的基本实现逻辑,都是先创建新的中间被观察者,利用这个中间被观察者从上游的被观察者获取数据,经过加工处理后,再传递给下游的观察者线程的切换本质上还是通过线程池和Handler实现其他常见操作符:map 转换事件,返回普通事件。

2022-10-26 05:25:22 503

原创 【CodeWorld】kotlin带参数的单例模式封装实现

【代码】【CodeWorld】kotlin带参数的单例模式封装实现。

2022-08-21 10:32:14 848

原创 【greenDao】Cannot access ‘org.greenrobot.greendao.AbstractDaoSession‘ which is a supertype of

【greenDao】Cannot access 'org.greenrobot.greendao.AbstractDaoSession' which is a supertype of

2022-08-10 07:47:36 479

原创 ARouter使用自定义注解处理器,自动生成跳转Activity的代码,避免手动填写和管理path

ARouter使用自定义注解处理器,自动生成跳转Activity的代码,避免手动填写和管理path

2022-08-06 15:25:53 930

原创 MediaRecorder录制屏幕时在部分机型上报错prepare failed:-22

在调用MediaRecorder.setVideoSize方法设置宽高时,由于宽高是动态获取的屏幕宽高,但是这个方法不允许传入奇数值,而出问题的手机的高度刚好就是奇数,所以就报错了。解决办法就是判断下宽高是否奇数,是的话就减1让它变成偶数,再调用setVideoSize方法由于该方法是Native方法,暂时不知道为什么一定只能传奇数,有知道的朋友可以下面留言告诉我...

2022-07-25 15:46:54 482

原创 如何将java/Android签名工具keytool单独提取出来使用

背景开发的工具有个获取Android app签名功能,用到了keytool,这个工具是存在于java/jdk/bin/keytool路径下的,一般只要配置了jdk环境变量都可以正常使用,但是当时没有考虑到有些人电脑没有配置这个环境变量,导致无法正常使用keytool命令过去签名信息解决方法将keytool.exe文件拷贝到项目中,发现没有配置jdk/bin环境变量时,还是无法正常调用;考虑到将adb命令集成到项目中时,也不是只拷贝adb.exe文件就够了,还需要将AdbWinApi.dll和AdbWi

2022-06-24 11:40:11 687

原创 Windows javaw进程占用cpu资源100% 导致电脑卡顿

Windows10电脑用着用着就发现很卡,打开任务管理器发现进程的cpu占用率非常高,导致cpu占用100%;稍微懂点开发的人都知道是java相关进程,也就是有某个java程序占用了很多cpu资源导致的卡顿在 -> 里拆卸对应软件就可以了,如果该软件是自己开发的,就需要做一下优化了...

2022-06-16 14:15:50 1553

原创 《java并发编程的艺术》学习小结

java并发编程的艺术第一章 并发编程的挑战上下文切换:cpu通过时间片让不同线程轮流运行,从线程状态保存到下一次线程运行这个过程就是一次上下文切换多线程并不一定比单线程快,因为多线程会有线程创建和上下文切换的开销如何减少上下文切换:无锁并发:锁竞争会导致其他线程挂起,加锁、解锁会导致线程频繁上下文切换不同线程处理不同分段数据使用CAS算法:比如Atomic包减少线程数协程:在单线程中实现多个任务同时运行避免死锁办法:避免一个线程同时获取多个锁资源尝试使用定时锁,lo

2022-06-15 16:20:18 138

原创 shell脚本操作Sqlite数据库

示例2:执行多条Sql语句示例3:结合adb shell命令上面这段代码用于获取所有app包名,然后插入到sqlite数据库中;Sqlite命令前后要加上 和,的左右不能出现空格和TAB符号

2022-06-15 13:45:25 4492

原创 Android获取所有App信息

示例代码/*** 获取所有APP信息,保存到SDcard/download/AppInfo.txt文件中*/public static void getAppInfo(Context context) { if (context == null) { return; } ArrayList<String> launchList = getLauncherList(context); Log.d("getAppInfo", Arrays.toString(new ArrayL

2022-04-24 14:16:32 3316

原创 Flutter运行环境配置小结

1.环境变量FLUTTER_STORAGE_BASE_URL=https://mirrors.tuna.tsinghua.edu.cn/flutterPUB_HOSTED_URL=https://mirrors.tuna.tsinghua.edu.cn/dart-pub2.AndroidStudio运行Android项目一直卡在Running Gradle task 'assembleDebug'...项目/android/build.gradle添加阿里镜像repositories { mav

2022-04-09 21:52:31 2579

原创 Python pyinstaller没有自动将依赖库打包进去,运行时提示找不到模块ModuleNotFoundError: No module named ‘PyQt5‘

问题以前是可以正常打包运行的,后来打包后发现目录下少了很多dll文件,比如Qt5Core.dll、Qt5Gui.dll等,运行exe提示ModuleNotFoundError: No module named 'PyQt5'分析原因由于打包时需要包含一些其他配置文件进去,所以需要修改xx.spec文件,于是打包时就使用命令pyinstaller -D xx.spec,但是不管怎么打包总是出现找不到PyQt5的问题于是尝试使用最原始的命令pyinstaller -D xx.py打包发现又是正常的,于

2022-03-31 14:21:11 4177

原创 Android 捕获主线程异常崩溃

一般情况下我们想要捕获全局异常会调用Thread.setDefaultUncaughtExceptionHandler方法;但是这个方法只能捕获子线程的异常,如果是主线程发生crash,则程序还是会崩溃;想要主线程不崩溃,可以在自定义Application加上下面这段代码:Handler(Looper.getMainLooper()).post() { while (true) { try { Looper.loop() } catch (e

2022-03-16 17:57:24 3617

原创 python QTableWidget表格设置item的字体颜色

有些博客上写的是调用QTableWidgetItem的setTextColor方法,但是实际开发却找不到该方法,可能是版本问题代码示例:item = QTableWidgetItem("登录成功")item.setForeground(QBrush(Qt.green))#设置字体颜色为绿色ui.tableWidget.setItem(0, 1, item)...

2022-03-09 17:24:59 5560

原创 python 使用webdriver模拟真实用户登录,拿到cookie信息包括httponly cookie

chromedriver.exe根据Chrome浏览器版本下载对应驱动文件查看Chrome版本(例如:94.0.4606.61): 地址栏输入chrome://version/下载对应版本驱动(找到94.0.4606.61文件夹,下载chromedriver_win32.zip文件):http://chromedriver.storage.googleapis.com/index.html将下载的驱动文件解压出chromedriver.exe文件,放到项目中import osimpor

2022-03-09 15:59:59 1109

原创 python将项目打包成exe文件

安装pyinstallerpip install pyinstaller打包项目如果就是简单一个py文件,在项目根目录下直接用命令pyinstaller -D filename.py即可,打包后会在当前目录下生成两个文件夹build是存放编译时的临时文件,dist存放打包好的exe文件;如果项目存在多个目录,涉及多个资源文件,则需要分多步进行项目根目录下执行pyi-makespec -w xxx.py其中xxx.py是指项目入口文件,执行命令后会在当前目录下生成一个同名的xxx.spec文件

2022-03-09 15:37:30 3145

ARouter使用自定义注解处理器,自动生成跳转Activity的代码,避免手动填写和管理path

ARouter使用自定义注解处理器,自动生成跳转Activity的代码,避免手动填写和管理path 文章地址:https://blog.csdn.net/guangdeshishe/article/details/126195119

2022-08-06

如何开启ubuntu的3D桌面特效

详细介绍如何开启ubuntu的3D桌面特效

2013-09-23

C#不规则窗体实现

C#不规则窗体实现,开发工具vs2008

2013-01-18

C#简易绘图程序

MyDrawApp-简易绘图程序,C#实现的简单绘图程序

2013-01-18

EditorApp-简单文本编辑器+打印与打印预览的实现

EditorApp-简单文本编辑器+打印与打印预览的实现

2013-01-18

C#开发的一个仿win7计算器

C#开发的一个仿win7计算器,拥有简单计算和科学计算功能,动态伸展面板

2013-01-18

java投票管理系统(源码)

主要功能的用例描述如下: 1.运行投票管理系统,此时背景音乐会响起。 2.点击“使用说明”来查看使用方法。 3.在候选人文本框中输入不超过10个候选人,候选人之间用空格隔开,点击确认以完成候选人的设置,点击旁边的取消可以从新设置候选人。 4.在生成的候选人选框中选择想要选的候选人,点击下面的“确定”按钮以完成选票的填制,此时在显示统计结果的地方能即时的看到选票统计结果。 5.重复第4步来填制下一张选票。 6.点击“排序”按钮后统计结果会按照候选人的票数从高到低进行排列。 7.点击“保存结果”会弹出一个文本域对话框,里面有刚刚统计的结果,ctrl+a全部选中,再ctrl+c复制,这样就可以将结果粘贴到别处保存下来。 8.点击“刷新”后回到主界面,重新设置候选人,进行下一轮投票

2013-01-18

java投票管理系统

本文主要是研究如何开发一个“简单、实用”的基于Applet的投票管理系统。本系统运用到了窗口布局、按钮事件的触发和字符串分析器等相关知识,界面简洁、清爽,操作简单,用户可以自定义候选人 ,允许用户修改候选人,支持多次投票,能够自动统计出一共投的票数、废票数、弃权票数和各个候选人的得票数。除此之外,本系统还支持排序功能,为用户自动按得票数从高到低进行排序。在此基础上,本系统增加了一些实用的功能,背景音乐给人以轻松愉快的操作心情,使用说明功能使用户容易上手,还有一个保存结果功能使用户方便保存投票统计结果。

2013-01-18

空空如也

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

TA关注的人

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