本文出自: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(倒计时相关)
<TextView android:id="@+id/txt_send_msg" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="bottom" android:paddingBottom="8dp" android:text="@string/time_left" /> <Chronometer android:id="@+id/chronometer" android:layout_width="wrap_content" android:layout_height="wrap_content" />
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,方法都可能无效