总结一下Android开发中遇到的疑难杂症~~
目录
1.使用.setAlpha()时,导致其他布局透明度也跟着改变
2.Kotlin协程报错 Animators may only be run on Looper threads
3.报错java.util.ConcurrentModificationException
4.在onCreate中调用showSoftInput()唤起软键盘无效
5.新建项目xml格式化时异常
6.报错出现类似“a.c.b”这种报错信息
7.Kotlin引入ARouter时报错:ARouter::Compiler >>> No module name, for more information, look at gradle log.
8.点击view显示PopupWindow,再次点击view时,PopupWindow会先消失再弹出。
9.Android Studio安装插件中途退出导致AS重新打开时报错。fatal error initializing plugin code iris
10.华为手机调试到断点,过几秒自动退出
11.部分手机App图标不显示
12.三方平台分享时不显示缩略图
13.分享到支付宝朋友失败,提示授权验证失败
14.EOCD signature not found in the last 65557 bytes of the file
15.引入kapt之后kotlin文件报错
极其扯淡的问题,刚开始完全一脸懵逼不知从何下手,后来通过查阅资料得知:当多个布局共用一个资源的时候,这个资源是共享状态的,也就是说一个地方改动,其他引用这个资源的地方也会受到影响。
解决方案:在调用 .setAlpha() 之前先调用 .mutate() 这样状态就不会共享了。
ln_vBg.background.mutate().alpha = 0//设置透明度时先调用.mutate()
很简单的问题,动画只能运行在looper线程。用Handler或者通知方式把动画转到主线程调用就行。
不过顺便记录下原因:Kotlin协程其本质就是一个线程池(不过增加了一些调度,它的创建和delay延迟调用都开销很小),所以操作UI还是要转到主线程。
这个是因为使用Iterator迭代器遍历集合的时候对集合进行了修改,导致.next和.remove抛异常。
解决方案:1.使用CopyOnWriteArrayList集合(这个集合允许遍历时进行增删); 2.加锁
因为showSoftInput()必须在当前布局绘制结束之后调用才生效,(onResume之后调用不行,因为view真正开始绘制是在onResume之后)。正确方法应该是延迟调用,代码如下:
activity.getWindow().getDecorView().postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
editText.requestFocus();
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
}
}
}, 100);
一个很小的问题,不过对强迫症来说不能格式化简直想死~~ 修改方法如下图:
当时也是脑袋晕了,这么简单的问题没想到。只要出现“a.b.c.x()”类似这种报错,把混淆关了在测试。就可以定位到问题了。如果关闭混淆之后没错误了,那就是混淆出问题了。
(混淆是个麻烦事,如果实在是不想混淆,建议直接用360加固或者其他的一些加固软件加固。)
就是没有设置module名,不过要注意,Kotlin在使用ARouter时引入方式和java不同,Kotlin引入如下图:
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
android {
...
}
kapt {
generateStubs = true
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
dependencies {
...
//阿里Arouter路由框架 支持模块间的路由、通信、解耦
implementation('com.alibaba:arouter-api:1.4.0') {
exclude group: 'com.android.support', module: 'support-media-compat'
exclude group: 'com.android.support', module: 'support-v4'
exclude group: 'com.android.support', module: 'support-v13'
}
kapt 'com.alibaba:arouter-compiler:1.2.1'
}
这个倒也不算bug,不过却着实是困扰了我很久。在自定义PopupWindow时,点击一个按钮触发PopupWindow弹出,并且添加阴影遮罩,设置点击外部时PopupWindow消失。然后问题出现在:再次点击按钮的位置时,本来应该隐藏PopupWindow,但是会出现先隐藏,然后再次出现的问题。
解决方法:添加 PopupWindow.setFocusable(true);
原因分析:其实流程很好猜,PopupWindow和遮罩出现后,再次点击View的位置时,先是触发了PopupWindow点击外部消失。然后再次触发了View的点击事件。(应该是点击外部消失之后,点击事件没有终止,而是继续下发,所以导致View的点击事件再次触发。) 添加 setFocusable(true) 方法之后,点击屏幕外部消失的点击事件也交由PopupWindow处理,处理之后不会再次下发。
在我安装这个插件时,不知道是因为我中途退出了还是插件有问题。重启打开AS直接报错,怎么都进不去。提示“初始化插件时出现致命错误”。
解决方案:其实很简单,这个插件出问题了,直接删了。
找到:C:\Users\自己的目录\.AndroidStudio3.5\config\plugins
找到报错的插件,删除,然后重新打开AS就可以了。
好像是华为9.0手机的一个小bug,anr时会强制退出。在开发者选项中选择 “待调试应用” 选择要调试的app,然后勾选 “等待调试器” 。设置后到断点就不会退出了(我的测试机是荣耀9x,emui9.1.1。测试可行,2019.09.16)
常见的一般是清下缓存,重启下就可以解决。
不过前几天碰见一个神奇的问题。公司上下几十个android手机图标都正常显示,只有一台vivo y66死活不显示App图标,但是在系统设置的应用管理中图标都正常显示。唯独桌面上App图标显示小机器人,后来灵机一动想到可能是 手机主题的问题 ,然后换了个主题试一下果然可以了,换过主题再切回原主题也正常。(应该是主题的图标缓存问题)
分享网页时,微信和qq不显示缩略图。已检查:1.图片不大于32k;2.url是https;3.url中不含中文; 但是依然不显示,查阅资发现,是因为测试环境的问题。直接换正式环境(网页url和图片url在一个域名下)就好了。
这个小问题困扰了我大半天,跟支付宝技术客服聊了半天。最后发现是分享MD5签名必须小写,小写,小写!
字面意思是什么“找不到签名”,因为我出这个问题的时候是没修改任何代码,(期间装了一次解压工具,不知道有没有关系)所以判断大概率是缓存问题,用了clean、rebuild、invalidate caches等等都没用,最后万能的谷歌查到了,把apk文件删掉,然后再clean。搞定。(apk文件一般在 app\build\outputs 目录下)
极其扯淡的问题,添加kapt之后,有一个kotlin文件build之后生成的java全部报错,因为它的报错信息是整个类的build文件全部报错(太不智能了),所以只能自己找问题了,各种google各种排查,最后发现是因为:
import com.***.***.`interface`.PaintViewUploadDataInterface
注意上面的 ‘interface’ ,因为这个包名含有关键字,所以在导包时kotlin自动添加 ‘’ 号,这样的话不会报错。 但是估计kapt是无法识别这种符号或者这个关键字的,导致编译失败。
直接把带有关键字的包名改掉就可以了。(注:养成好习惯,包名、类名等一定不要使用关键字或者接近关键字的,以免出现歧义或者报错。)