- 博客(89)
- 问答 (2)
- 收藏
- 关注
原创 新版AndroidStudio的Gradle窗口显示task list not built 问题解决
在使用新版AndroidStudio时,会出现,的问题。如果你记得task的名字,当然可以 直接通过命令或者直接执行即可,但是若是记不住,还是把这个任务构建处理比较好用。
2024-03-08 12:48:21 771 1
原创 使用KMP(kotlin多平台)开发Compose,如何打包成可执行文件?exe、DMG……
上一次的分享中,我分享了,如何在windows平台上直接通过IDE运行compose。使用的方式是:双击ctrl,然后,执行gradle run有朋友问,我是能够执行了,但是这毕竟是调试方式,它还不是一个可以分享给别人的可执行文件呀,我写一个程序,只能在自己电脑上运行,那没啥意义呀。那今天我分享一下,如果将compose的代码,打包成一个Windows平台的可执行文件(其他平台同理,看一下就知道)。
2024-03-05 12:03:50 1293
原创 使用KMP(kotlin多平台)在windows上出现:Cannot locate tasks that match ‘:composeApp:compileJava‘ as task ‘compil
kotlin 多平台在windows上运行失败解决方案
2024-01-26 10:59:38 566 7
原创 数据结构与算法:插入排序
arr[i]和arr[i-1]比,若 arr[i-1] 大于arr[i],交换两个值。arr[0]和arr[1]对比,若arr[0] 大于 arr[1] ,交换两个值,arr[1]和arr[0]再比,arr[0] 大于 arr[1] ,交换两个值。arr[1]和arr[0]再比,arr[0] 大于 arr[1] ,交换两个值。arr[2]和arr[1]比,若 arr[1] 大于arr[2],交换两个值。arr[2]和arr[1]比,若 arr[1] 大于arr[2],交换两个值。时间复杂度 O(n²)
2023-12-14 00:51:07 94
原创 数据结构与算法:冒泡排序
arr[i] 和 arr[i +1]对比,若arr[i]大于 arr[i+1],交换两个值。arr[n-2]和arr[n-1]对比,若arr[n-2]大于arr[n-2],交换两个值。arr[0] 和 arr[1] 对比,若arr[0] 大于 arr[1], 交换两个值。arr[1] 和 arr[2]对比,若arr[1] 大于 arr[2], 交换两个值。arr[2] 和 arr[3]对比,若arr[2]大于 arr[3],交换两个值。确定出 arr[1]的值,同时确定了arr[0]的值。
2023-12-14 00:49:42 73
原创 数据结构与算法:选择排序
每次都要在剩余未排序的集合中,找到那个最小(或者最大)的值,放到当前位置。从当前位置到最后,找出最小(或者最大)值,放在当前位置,位置后移。第i次:找到 i ~ n-1范围内最小值,放在i 位置。第一次:找到0 ~ n-1范围内的最小值,放在0位置。第二次:找到1 ~ n-1范围内最小值,放在1位置。最小或者最大,影响的是降序还升序。额外空间复杂度 O(1)时间复杂度 O(n²)
2023-12-14 00:48:24 120
原创 数据结构与算法:衡量算法好坏的指标——复杂度
复杂度,用来分析算法执行过程中,所需要的资源。时间复杂度是衡量所需要的时间。空间复杂度,是衡量所需要的(内存)空间。
2023-12-14 00:46:15 221
原创 MAC电脑连接外接显示屏,颜色显示有问题,又粉、紫色蒙版,问题处理(1)
买了一个显示器,想给mac做分屏使用,结果连上之后发现,整个屏幕像是被蒙上了一层紫色的蒙版。
2023-11-17 10:54:22 3029
原创 在项目中增加网络加载需要考虑什么?
一般文件校验失败了,也就证明当前缓存是有问题的,或者中间被人篡改了。这时根据当前文件是缓存还是直接下载的文件,去做对应的处理。如果是缓存文件,会直接删除重新下载,如果非缓存文件,可能提示出错等。既然是缓存,就需要考虑缓存的清理策略。对于磁盘缓存来说,如果你的项目中已经存在磁盘缓存,可能需要将当前的缓存文件类型,纳入到原来的缓存管理中,进行统一处理。我们熟知的缓存策略可能就是Glide中的图片三级缓存策略了。网络加载的第一步肯定是下载,那么选择一个合适的下载器是十分重要的,这个下载器最好支持什么功能?
2023-08-12 23:26:10 243
原创 腾讯出品Pag动画框架在Android端的使用-网络Pag加载
在我们可以通过assets的方式加在pag文件之后,我们会考虑下一个问题,可不可以用Pag框架加载网络文件?为什么会有这样的问题出现,或者说网络方式加载可以解决什么问题?APK 体积增加问题当一个项目规模比较大的时候,会做很多优化工作,其中「APK瘦身」便是一项优化点。通过网络的方式加载可以减少内置文件,从而降低APK大小。热更新问题我们有时候是有这样的需求的,线上更改动画效果,通过网络方式便可以做到。新的功能或者组件上线,需要更新客户端问题。
2023-08-12 23:23:41 952
原创 腾讯出品Pag动画框架在Android端的使用-初级
Pag动画框架作为一个第三方框架,它的优缺点与Lottie是相似,此处不过多赘述。如果你们的项目中打算用了,肯定是经过了一定的调研的。Pag动画框架分几个版本,有免费的有收费的。我们目前用的社区免费版,只用来展示Pag动画。高级的版本可以播放视频、声音等,酌情选取。
2023-08-12 23:21:36 914
原创 非原生动画框架在Android端的使用
在Android平台上,除了我们熟知的属性动画(Animator),View动画(Animation),后面出的Transition动画,还有其他第三方出的动画库可以供我们使用:Lottie(Airbnb)、Pag(腾讯)与Lottie相比,Pag的优势在于,只需要一个pag文件即可(整体打包)。我们的项目中用过lottie 动画,现在在逐步使用Pag动画。文档:http://airbnb.io/lottie/#/方便云控,可以通过下载动画文件,更新动画。有一定的可复用性,通过替换文件实现。
2023-08-12 23:15:18 118
原创 Gradle build 失败后提示.lock文件,解决办法
在Gradle build失败之后时,有时候强制关闭AndroidStudio,再次打开build时,会提示各种.lock 文件问题,删除了一个还有下一个,而且路径不一样。一般情况下是这两个文件夹下的lockfile影响继续build。
2023-07-28 15:21:03 579
原创 Android TextView 展示特殊字符高度变高问题解决
在我们的项目中,展示文字是很常见的需求,但是在线上展示中发现,有些信息是特殊字符展示的,而且这些字符的高度会导致TextView的高度变高(与正常字符比)。效果如下:很明显,带特殊字符的高度,会非常高!
2023-06-27 21:42:20 837
原创 PAGFile手动设置速度失效问题处理
变速播放:首先设置 PAGFile.setTimeStretchMode(PAGTimeStretchMode.Scale),然后通过 PAGFile.setDuration() 接口设置你想变速后播放的时长即可,设置比原始更长时间是慢速播放,设置更短时间是快速播放。举例:一个8s长的pag文件需要循环播放3~6s,将PAGFile添加到PAGComposition后,设置PAGFile的startTime为-3000000,duration为6000000。原运动速度为1s总时长,想改为2s。
2023-06-08 12:00:29 252
原创 Glide预加载图片preload失效问题修复!
我在preload的时候,没有传入宽高,默认按原图取,走的api是不带分辨率path 的。而当使用的地方传入了imageView,它会根据imageView的宽高,请求对应分辨率的API,导致转换后的key变了,相当于我请求的虽然是同一个地址,但是转换成了两个。结果发现,并没有想象中的预加载效果,它貌似还是走的网络加载。为了提高用户体验,想要先下载图片,然后下载完成之后,再对图片进行展示,这样用户就不必看到加载图片时的空白状态。最终发现,是因为生成的key不一样,怎么会不一样呢,我明明获取的是同一张图片!
2023-05-25 15:01:35 1016
原创 Android事件分发汇总贴
Android事件分发上是从触摸板硬件层,一直传递到当前处理的View的过程。期间涉及到跨进程通信,主线程Handler处理消息,Window传递事件,Activity传递事件等等等等。学习事件分发,让我有能力面对复杂状态下,使控件有正确的行为。之前已经写好了3篇文章,从流程,到源码分析,到实际案例演示。希望你看过之后也有帮助,可以在评论区与我探讨遇到的各种情况哦。
2023-04-03 16:58:23 69
原创 Andorid 事件分发机制案例实操与解析
根据问题的前提,我们知道这是两个RecyclerView重叠摆放的问题导致的,当然我们可以自定义ViewGroup,重新定义两个View的摆放规则,但是那不在我们本次讨论范围内,我们只考虑当前的实现方案,如何最终实现这个功能。Android 的触摸事件,是从屏幕硬件触发,最终到达目前正在展示的Activity的,至于这期间如何传递的,此处不做讨论,我们讨论的起点,从Activity接收到触摸事件开始。事件传递相关的流程与 源码分析在上面的文档中已经看到了,接下来,我们来实现一下,文章开头提到的实现目标。
2023-04-03 16:50:52 492
原创 Android 事件传递相关流程图
之前从来没有总结过Android事件传递的流程图,此处,绘制一下简版Android事件传递流程图,方便理解事件传递的过程。
2023-04-03 14:44:54 157
原创 Android 事件分发源码解析(基于API31)
View类型的组件,接收到一个事件,是用dispatchTouchEvent开始执行。若自身设置了OnTouchListener,则执行OnTouchListener的onTouch方法。根据OnTouchListener的OnTouch方法的返回值判断是否执行自身的onTouchEvent方法onTouch 返回值为false,则执行自身的onTouchEvent方法onTouch返回值为true,直接返回结果。
2023-04-03 14:34:59 556
原创 RecyclerView 滚动条不显示
RecyclerView的滚动条不显示了,代码如下。给RecyclerView 加一个background即可。
2023-02-15 10:52:35 593
原创 Android Studio 升级之后Logcat变了个鬼样子
在AndroidStudio 升级到Dolphin之后,Logcat变了。恢复到原来状态在下方。这是新增加的实验性功能,不过我感觉不如原来的好用,把前边的✅去掉就好了。
2023-02-10 15:34:52 450
原创 切换Fragment,RecyclerView滑动一下
在四个tab中,其中一个Tab下包含了一个横向的RecyclerView,每次切换到该Tab时,RecyclerView会滑动一下。只在三星 Android 8.0 上复现。
2023-01-17 10:37:16 361
原创 Serializable引起的崩溃NotSerializableException
此类中还调用了其他的类对象(也就是上文中的VipInfo),调用的类对象必须一并实现Serializable。在Android中使用时,我将它作为一个参数,通过Bundle传递给Fragment,但是在序列化时报错了。
2022-12-28 10:29:08 319
原创 Kotlin调用Java代码时引起空指针异常,要怎么避免?
在Android项目中,经常会出现Kotlin 代码调用Java代码的情况,而在Kotlin编译器中,有这样一个默认的规定,如果Java中的代码被Nullable标记才认为是可控类型,否则, 如果你不指定为可空类型,利用类型推断会直接断定为非空类型。在Java里边最麻烦的便是空指针异常,而即使转到了Kotlin,当调用Java 代码时,仍然会存在这样的问题。注释,包括Android框架中的代码,也不是所有的地方都加了该注释,这样不利于Kotlin编译器进行类型推断,当没被。
2022-11-25 16:54:38 1006
原创 Android 通过ContentResolver添加CalendarEvent,删除后在某些机型上依然存在问题
App添加日历提醒功能,添加到系统日历中,网上有很多例子,可以参考,在我的测试机上,点击开关时,去添加事件(同时添加提醒时间),点击关闭开关时,去删除事件(同时删除提醒)。在某些机型上,即使删除了事件,还是能查询得到事件,但相关提醒已经删除了。在判断事件是否存在时,同时判断,是否已经删除~~开关状态通过 判断事件是否存在来判断。projection中 添加。在查询的实体中,添加。
2022-09-19 15:14:23 520
原创 None of the following candidates is applicable because of a receiver type mismatch
Unresolved ReferenceNone of the following candidates is applicable because of a receiver type mismatch:* internal val File.root: File defined in kotlin.io
2022-06-30 15:51:40 3291 1
原创 Java中子类继承父类,父类中定义定义了抽象方法,子类在实现时,给子类变量赋值,执行构造后,变量值恢复成默认值
定义了一个抽象类()如下,目的是提供通用接口,在创建时会调用initData方法。2、创建实现类3、调试并验证按照我的预期,结果应该是:但是结果却是:表现出来的现象是,代码执行完init赋值之后,又被赋值回初始值了。背景就上面的问题了,通过打断点等等一系列调试之后,发现,在子类执行完父类的构造方法之后,又将自己的属性赋值了。于是推测,是子类属性赋值与父类构造方法的执行顺序导致的问题出现:我发现,在invokespecial处是执行父类构造方法,执行之后,果然在下面又对自己的属性赋值了初始值。既
2022-06-13 12:14:28 1354
原创 MotionLayout切割子View
问题描述使用MotionLayout,高度设置为wrap_content, 增加padding,内部一个子View为TextView,发现先试试TextView下半部分被切割!源码<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
2022-05-07 20:23:17 207
原创 「解决问题系」AndroidStudio出现代理错误‘‘you have JVM property “https.proxyHost“ set to “xxxxxx““
问题描述背景:系统 MAC OS前几天强制关闭了Charles,整个电脑不开启Charles无法上网,猜测是因为电脑中的代理问题,删除了代理之后上网正常,但是打开AS(AndroidStudio)Gradle无法下载包,并提示”you have JVM property “https.proxyHost” set to “xxxxxx”“控制台有如下输出,很明显是代理问题。”Caused by: org.apache.http.conn.HttpHostConnectException: Conne
2022-04-06 18:20:47 5555 1
原创 Java中的线程安全(2)之互斥同步的底层原理
Java中的线程安全(2)之互斥同步的底层原理本来在理解完互斥同步之后,应该开始扒一扒Lock的源码了,但是在真正进入源码阶段之前,需要先按照常人的思维去理解一下,如果,让我们自己实现一个这样的互斥同步,我们该如何实现互斥同步呢?互斥同步都需要什么呢?首先,我不是所有代码都需要互斥访问,那么在需要互斥访问的地方,我需要有一个标记,证明我的代码是要互斥访问的。其次,我需要一个标志位,来控制这段互斥访问的代码,是否正在被别的线程访问着。如果多个线程都想要访问这段代码,需要一定的机制,让非正在访问的线程
2022-04-06 11:04:58 2675
原创 Java中的线程安全(1)之互斥同步
Java中的线程安全(1)之互斥同步最近的一段时间见一直在研究线程安全的实现原理。以前知道Java给提供了synchronized关键字和JUC工具包可以用来实现线程安全访问。当时我就有一些疑问,为什么需要这样的工具?而以上的这两种方式分别是怎样保证的线程工具?总结下来就是这样两个问题:synchronized关键字是来解决什么问题?为什么它能解决这样的问题?有了synchronized为什么又出了Lock?1. synchronized关键字是来解决什么问题?在解释这个问题之前,先看
2022-03-17 20:04:10 693
原创 Handler到底是一个什么东东
Handler到底是一个什么东东作为一个Android开发工程师,Handler简直是必须要了解的东西。每次面试前,Handler都会悄悄地钻到耳边对我说:“嘿,哥们,老地方见!”果然,面试又问到了,而Handler又跑过来BB:“又被我难倒了吧!”(内心独白,老子就不信搞不定你!)于是便有了这篇解析。先来几个问题你了解Android的Handler机制吗?(我美不呲呵的说,那必须了解,一顿白话之后就有了下面的问题)你知道Handler在安卓framework中有哪些应用吗?你知道Hand
2022-02-17 19:53:49 2930
原创 Flutter TextField 设置可输入多行
主需要在maxLines中传递null即可TextField( // 传递null maxLines: null,),
2021-12-28 15:58:53 3115
原创 Flutter TextField输入文字时,若页面刷新,会导致光标位置发生变化。
问题描述前提:使用了Provider + 输入框的形式,当输入框的数据都输入时,提交按钮显示可用,否则不可点击。定义了一个Model用于保存是否可点击状态class StatusModel extends ChangNotifier { bool _canSubmit = false; bool get canSubmit = _canSubmit; set canSubmit(bool isCansubmit) { if (_canSubmit == isCansubmit) {
2021-12-28 11:34:03 2554
原创 Flutter 自己封装TextField,导致在列表中数据更新时,数据显示错乱问题。
需求有一个可输入的列表,输入列表会根据选择的选项不同,而输入不同内容。比如:选择 Vip客户时,需要输入:姓名,手机号,住址,Vip时长,付款方式选择普通用户时,需要输入:姓名,手机号,住址。实现使用ListView展示所有的输入项,因为输入框具有通用性。所以做了一个简单的封装。左侧为标题,右侧为输入内容,空内容时,展示hint提示请输入。大概是这样的样式-----------------------------客户类型 ⊙Vip ⊙普通------------
2021-12-28 11:33:03 1714
gradle lock文件清除
2023-07-28
清除gradle产生的 lock文件脚本
2023-07-28
Chrome插件-M3U8 Downloader
2023-03-15
如何在开发阶段将代码尽量尽量做到完美?
2017-11-09
TA创建的收藏夹 TA关注的收藏夹
TA关注的人