Android 8.0原生计时器Chronometer方法无效问题解决

本文出自: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,方法都可能无效

源码下载:

https://github.com/JinBoy23520/CoderToDeveloperByTCLer

写在最后微信扫码提问


猜你喜欢

转载自blog.csdn.net/dt235201314/article/details/80384423