- 博客(27)
- 收藏
- 关注
原创 android room数据库升级脚本常见问题
room对kotlin的支持不错,在Entity的data class中,声明为可空的字段,room生成的sql语句会允许null,否则就会加上不允许空。一般这个问题是修改了Entity class内容,但是却漏了升级脚本。意思是数据库执行完你编写的升级脚本后,发现数据库当前的表结构与你代码中的Entity class结构不一致,所以报错。只需要仔细对比一下Expected行与Found行的内容,哪里不同,就去修改升级脚本或Entity class即可。room数据库升级很容易遇到一个问题,
2024-06-05 15:44:47
315
原创 安卓Activity上滑关闭效果实现
Activity使用时,只需要把根View设置为这个自定义view,然后透明主题,透明背景,同时关闭Activity的进入退出动画,便可以实现如图效果了。做这个效果的时候,关键就是要注意外层拦截触摸事件时,需要有条件的拦截,不能影响到内部viewpager的滑动处理。因为屏保是可以左右滑动切换的,内部是一个viewpager。最近在做一个屏保功能,需要支持如图的上滑关闭功能。
2024-03-28 13:47:12
490
原创 VerticalGridView适配触摸屏踩坑,触摸滑动时位置重置/闪烁问题
VerticalGridView是什么?VerticalGridView是安卓leanback库的列表组件,用于支持使用遥控器(按键事件)浏览列表。它与RecyclerView的继承关系是:VerticalGridView→BaseGridView→RecyclerView首先我想吐槽一下leanback的BaseGridView相关组件,耦合度较高,并且不允许开发者替换其LayoutManager,且该GridLayoutManager是final修饰,不允许继承。这样出了bug都没法给他改。
2023-12-29 16:53:16
1204
1
原创 使用kotlin协程与Flow,50行代码实现网络测速功能
最近使用kotlin的flow,重构之前同事写的网络测速功能,发现flow用起来太舒服了,原本好几个类一堆代码,现在50行就实现了核心逻辑。实现了,输出每秒网速,最多限制10秒,求平均网速的需求。
2023-06-29 11:08:14
757
原创 安卓MVI架构模式常见问题:View层接收不到新的StateFlow状态
比如,如果ui层使用这种方式声明ViewModel,那么每次用到ViewModel时,都会从依赖注入框架中取,如果该ViewModel没有声明为单例,那么每次都是创建新的。(案例:StateFlow中存放页面State,页面State中存放下载状态State,此时如更新下载进度,如只修改下载进度,复用下载状态State,会导致StateFlow认为对象没有发生变化,从而不通知到订阅者)如果StateFlow的值是密封类,并且内部嵌套其他密封类,那么,两个密封类对象都需要重新创建,不可复用。
2023-06-01 11:19:49
700
原创 轻量级的安卓百分比屏幕适配方案SimpleAutoSize
AutoSize是基于今日头条的适配方案,但它有一些缺点,比如代码侵入性较强,在使用第三方的View框架时,可能会出现不兼容的情况。我目前的sdk项目不能使用这样的框架,于是自己做了一个简单的工具类,也能够满足基本需求。
2023-05-10 10:29:20
934
原创 Flavor在多子module的项目环境下,依赖冲突的处理
当主副模块的dimension相同时,应尽量使用matchingFallbacks方案,让自己的一个flavor去支持副模块的一个或多个flavor。如果主副模块dimension不同,或主模块不关心子模块的flavor时,应使用missingDimensionStrategy的方案,可以忽视子模块的某个dimension下的flavor,并且为其设置优先级。
2023-03-13 19:55:04
840
1
原创 利用Android SAF(存储访问框架)进行游戏反和谐(伊甸园的骄傲)/Android data目录的访问限制
最近在玩一个手游,伊甸园的骄傲,日服客户端中的一些立绘稍微有些暴露,国服上线后不出意外的被和谐(添加布料)了 但nga的大神们总是有办法解决,一位大佬就提供了反和谐的方法:大致是将日服客户端的资源文件提取,替换掉国服客户端的资源文件,来完成角色立绘的反和谐。但方法是有了,帖子下方仍然有不少玩家难以反和谐,因为目前的一些手机厂商,为了用户的安全,禁止了很多权限,包括用户访问data目录的权限,这使得用户必须root手机之后才...
2021-08-18 17:59:01
4647
3
原创 download maven-metadata.xml巨慢,卡住的问题
最近遇到项目依赖同步时的一个问题,同步过程中卡在download maven-metadata.xml,等待许久之后报错:Could not run phased build action using Gradle distribution 'https://services.gradle.org/distributions/gradle-xxx-all.zip'.最后发现这个问题原因是项目依赖的仓库,其中一个(或多个)无法访问,导致出现问题网上有人是把 maven ...
2021-07-12 12:13:58
6126
1
原创 Andoird应用内部悬浮窗小记
大家都知道安卓里面的悬浮窗分为两种,一种是手机全局置顶的悬浮窗,需要SYSTEM_ALERT_WINDOW这个权限,才能使用一种是应用内部悬浮窗,不需要申请权限,但只能在应用内部显示第一种悬浮窗网上有很多个相关文章,都可以实现今天我需求中需要使用第二种,应用内的悬浮窗,也就是不需要申请权限的。为了防止忘记用法,这里稍微记录一下。一、getSystemService()(WindowManager) activity.getSystemService(Context...
2021-03-12 17:38:18
400
原创 安卓中的虚拟键盘实现,KeyEvent的事件分发、处理机制。EditText是如何将KeyEvent事件转为字符输入的?
一、实现一个可以模拟输入的软键盘一开始,我们的需求是在用户经常使用的部分界面中,增加虚拟软键盘,减少用户对于外接键盘的依赖如图,在整单改价界面右侧增加了方便用户快捷输入的软键盘,用户不需要使用外接键盘,即可完成常见的商品改价等操作。那么这个代码逻辑实现起来比较简单,因为业务中有许多类似界面需要使用该软键盘功能,所以我们将它单独封装为一个View: mView = View.inflate(context, R.layout.res_keypad_view, this...
2021-01-06 13:54:47
5318
6
原创 kotlin 协程,延迟x秒,并可以提前结束此延迟的代码实现
先说下业务背景需求是要实现一个语音播报队列,这个队列中可以加入外卖类型语音和收银类型语音然后外卖语音加入到队列开始播放时,播放完成后延迟5秒钟继续播放队列中的下一条语音收银语音的需求比较特殊,收银语音插入时,会打断正在播放的语音(不管是外卖语音还是收银语音),并立即开始播放收银语音可以理解为收银语音同一时刻只能存在一个,添加多个时不会插入到队列尾部,而是以最新的为准进行播放难点就在于这个打断机制,因为我们收银语音的插入时,播放队列的状态可以看做是三个1、队列为空2、正在播放某
2020-11-02 17:11:01
4825
原创 Flutter踩坑:ListView布局报错,RenderFlex children have non-zero flex but incoming height constraints are...
完整报错信息:RenderFlex children have non-zero flex but incoming height constraints are unbounded.When a column is in a parent that does not provide a finite height constraint, for example if it is in a...
2019-10-07 15:37:45
27850
1
原创 debug包签名校验失败,release包正常
最近遇到了一个问题已经开发、联调完毕的接口,突然在debug模式下运行,调用接口返回签名校验失败,但是release包却没有任何问题签名计算的过程是把模型内所有字段拼接起来,再按照一个规则产生的先是看了代码记录,发现这段逻辑没有动过然后就断点,着重看下签名计算流程我们是先产生一个requestModel,然后使用反射,获取它的内部所有属性,将他们拼接断点中发现,反射获取到的...
2019-08-21 17:02:04
519
原创 WindowTree - Android下强大的界面管理框架,智能构建页面,权限管理,未读小红点智能计算,灵活的界面跳转和通讯
WindowTree只需使用注解,帮助你轻松维护树形界面的层级关系,管理你的界面结构,当你处于界面的任何位置时,都可以知道,我在哪里,我的父界面是谁,我的子界面是谁。甚至能够自动构建你的界面结构。WindowTree结构windowTree将应用内的所有界面都视为一个Window,每个window都拥有与之关联的WindowInfo,借助WindowInfo,你可以完成灵活、...
2019-03-02 19:17:43
507
1
原创 一次应用网络问题的排查
最近一个新版本发布后,部分用户反馈收银速度慢了很多,平时只需两三秒的扫码付款,现在需要几分钟甚至更久我们回顾整个版本改动,发现只是在原有基础上添加了网络监测功能,收银模块并无改动排查日志时发现了,以下异常情况:异常一:收银操作设置的超时时间为最长40秒,但是日志显示有超过一分钟的收银记录 异常二:网络监测模块明明设置了超时时间,但发现了最久达900秒的记录网络后台监测功能的设计是这...
2019-02-28 21:50:22
357
原创 文件句柄泄漏:Toast.show()引发的RuntimeException: Could not read input channel file descriptors from parce
最近友盟总是收到这样的异常:java.lang.RuntimeException: Could not read input channel file descriptors from parcel. at android.view.InputChannel.nativeReadFromParcel(Native Method) at android.view.InputCha...
2018-11-29 11:12:23
1686
原创 ListView数据源不同步问题The content of the adapter has changed but ListView did not receive a notification.
最近项目中出现了很多下面的异常:java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a
2017-12-19 15:44:21
540
1
原创 安卓实现分业务模块异常捕获,全局异常不崩溃,应用继续运行!
需求:按当前项目工程的组织结构,业务模块被分为多个独立的Module,要求当业务模块内发生未捕获到的局部异常时,不重启整个应用,只是单独重启某个异常的业务模块目前安卓中常用的异常捕获有两种方式:一种是局部异常捕获,使用try catch包括目标代码块一种是使用Thread.setDefaultUncaughtExceptionHandler捕获全局异常,但主线程发生异常使用此种方式捕获
2017-12-08 11:03:38
3574
1
原创 greendao插入数据UNIQUE constraint failed: PURCHASE_ORDER_TABLE._id (code 1555)
最近在项目即将上线时遇到这个问题,表面上看来很简单greendao的数据库表,id字段是唯一的,是因为插入了id重复的数据造成的但是,我们的业务逻辑是,清空数据库之后,再插入数据,理论上不可能出现重复idDaoUtils.getDaoSession().getPurchaseOrderTableDao().insertInTx(mPurSkuList);代码行数
2017-09-15 17:17:11
5438
原创 使用Android studio 的Analyzer Task分析解决activity内存泄漏问题
最近接手的一个老项目,功能比较繁杂,是运行在安卓pos机上面的收银系统,基本需要应用整天在前台使用,对系统稳定性要求较高,不同于一般app。今天做了内存方面的检测首先我们用电脑连接设备,用cmd执行adb的内存检测的命令adb shell dumpsys meminfo best.DianJiaPos后面的best.DianJiaPos是包名,要改成自己的执
2017-07-27 18:02:56
5970
原创 Messenger与AIDL的区别
大家都知道目前安卓的各种第三方推送服务都是采用多路复用的技术,即多个app共享一个后台service,一条长连接处理多个app的推送任务。那么移动的aoe推送也是采用这种方案,在这里分享下研究结果。进程间通信,一般有两种方式AIDL和Messenger。1. Messenger是对AIDL的一种封装,开发的时候不用再写.aidl文件。结合我自身的使用,因为不用去写.aidl
2017-06-13 21:43:43
639
原创 Android事件分发传递机制的领悟和理解
(此文章是以发表日期的两年前所写,但至今来看仍不过时,所以再在此发表)这两天在做这个美女图片软件时,为了实现一个需求,遇到了由于事件分发传递机制引起的种种异常、难题和BUG,对事件分发传递有了进一步的理解,悟出一种重写事件分发的最佳实践(个人认为的最佳方法)。。需求如图,主界面是由三个ListView和一个标题栏组成的,三个ListView都可以自由上下滑动,现有一个需
2017-06-13 16:43:36
325
原创 混淆泛型造成的应用逻辑问题getGenericType()
最近在一个支付sdk项目里发现一个问题,客户拿去集成后发现充值记录,消费记录查询不到,但是使用抓包软件发现,明明是获取到数据的,那么为什么显示不出来?而且没有任何报错呢?如果有异常信息的话,可能是很容易找到问题所在的,但是这次的居然没抛异常。。我从获取数据的代码,一路追踪,发现是解析数据出了问题,服务端返回的是xml字符串,sdk需要把它解析为一条条记录,展示到界面上上解析xml的部分代码
2016-09-27 16:39:50
6621
原创 miui系统神隐模式导致app后台服务无法连接网络
最近在一个推送项目中遇到了一些问题,发现小米手机无法收到推送,很奇怪,看了日志发现,日志中出现很多网络问题,想到有可能和神隐模式有关于是写了个demo验证我的猜测,service中的代码如下:打印log经过整理后如下:miui的默认配置是:发现:应用安装后在神隐模式的默认配置下,应用进入后台,三分钟以后网络会被限制,NetworkInfo.isConne
2016-09-27 16:18:15
5092
2
原创 Android Toast与Looper的深入研究,Toast是否属于修改UI界面
偶然看到csdn的一篇帖子非常有趣http://bbs.csdn.net/topics/390781513public void onClick(View view) { new Thread() { @Override public void run() { Looper.prepare();
2016-03-11 12:58:44
1841
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人