本文出自:https://blog.csdn.net/DT235201314/article/details/80384423
一丶概述
前段时间在还没完成项目交接的情况下,就被邮件@改BUG,直到现在都还没完全搞清楚这个项目,幸运的是修改部分与整个项目关联不大。大致了解,项目是黑莓手机定制的TCL账号统一管理APP,不对,并没有程序入口,应该说是内置应用sdk。
二丶问题描述
在Android 8.0 手机上,注册手机验证页面倒计时功能失效,显示%ss
三丶问题分析
1.首先这是个8.0系统兼容问题,赶紧恶补Android 8.0 新特新啊;
2.到计时出问题,换倒计时控件呗(治标不治本),说好的研究原理;
3.没有Android8.0测试机,申请呗(刚好可以做缓兵之策);
四丶实际操作与问题解决
1.黑莓测试手机申请到位
2.添加启动入口安装测试
提示:是否卸载内部应用,安装失败
内置应用?不能安装?那还怎么玩?(实际原因,版本号低于手机上的)
3.索性复制这个页面测试(见上文GIF)
(1)问题排查是不是定时控件的问题:
.xml(倒计时相关)
java代码
timer = (Chronometer) findViewById(R.id.chronometer);
timer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer arg0) {
if (countdownNum <= 0) {
// resetSendBtn();
return;
}
txtSendCode.setText(String.format(getResources().getString(R.string.time_left), "" + countdownNum));
countdownNum--;
}
});
doCountdown();
/**
* 倒计时
*/
private void doCountdown() {
countdownNum = COUNT_MAX;
txtSendCode.setEnabled(false);
txtSendCode.setFocusable(false);
timer.start();
}
测试结果:
没问题啊!(这里为了方便看效果,把xml定时器的 android:visibility="gone"属性给删了,埋坑了)
(2)看日志
相信谷歌,加权限咯(实际上这个页面,没有任何与权限相关的代码,内置后台应用,可能是后台需要)
int REQUEST_EXTERNAL_STORAGE = 1;
String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(
this,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
测试:时而有权限请求弹框,时而没有,bug依然存在。
(3)回顾定时控件测试操作
删了android:visibility="gone"属性,添加上,问题复现,删除bug“解决”
终于找到原因了。
查看定时器Chronometer源码
API25:
API:27
isShow是View方法
只有当android:visibility="VISIBLE"时方法才会执行
找到问题原因!!!
解决,颜色设为透明,放不起眼的位置(就不改倒计时控件了)
另外Android studio查看API 27方法:
修改build.gradle的属性compileSdkVersion 27,下载后查看。
大胆猜想:8.0后有耗时线程操作的控件当android:visibility=""属性设为gone,方法都可能无效
源码下载:
https://github.com/JinBoy23520/CoderToDeveloperByTCLer