首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CountDownTimer onTick()无法更新类的成员

CountDownTimer是Android中的一个计时器类,用于实现倒计时功能。它提供了onTick()方法,用于在计时过程中更新UI或执行其他操作。然而,有时候我们可能会遇到一个问题,即在onTick()方法中无法更新类的成员变量。

这个问题通常是由于Java中的作用域限制导致的。在CountDownTimer的onTick()方法中,我们只能访问到final或effectively final的变量,而无法直接访问类的成员变量。这是因为onTick()方法是在匿名内部类中执行的,而匿名内部类中只能访问final或effectively final的变量。

为了解决这个问题,我们可以使用一个中间变量来存储类的成员变量,并在onTick()方法中更新这个中间变量。然后,在需要访问类的成员变量的地方,我们可以使用这个中间变量的值。

以下是一个示例代码:

代码语言:java
复制
public class MyCountDownTimer {
    private long mRemainingTime; // 类的成员变量
    private long mCountDownInterval;
    private CountDownTimer mCountDownTimer;

    public void startCountDown(long millisInFuture, long countDownInterval) {
        mRemainingTime = millisInFuture;
        mCountDownInterval = countDownInterval;

        mCountDownTimer = new CountDownTimer(millisInFuture, countDownInterval) {
            @Override
            public void onTick(long millisUntilFinished) {
                mRemainingTime = millisUntilFinished; // 更新中间变量
                // 在这里执行其他操作
            }

            @Override
            public void onFinish() {
                // 倒计时结束时的操作
            }
        };

        mCountDownTimer.start();
    }

    public long getRemainingTime() {
        return mRemainingTime; // 返回中间变量的值
    }
}

在上面的示例中,我们使用mRemainingTime作为中间变量来存储类的成员变量。在onTick()方法中,我们更新mRemainingTime的值。在需要访问类的成员变量的地方,我们使用getRemainingTime()方法来获取中间变量的值。

这样,我们就可以在CountDownTimer的onTick()方法中更新类的成员变量了。

对于CountDownTimer的更多详细信息和用法,可以参考腾讯云的官方文档:CountDownTimer

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CountDownTimer使用心得及总结

而google官方也帮我们封装好了一个类:CountDownTimer,使我们的开发更加方便; 二、API CountDownTimer是一个抽象类,有两个抽象方法,它的API很简单 public abstract...void onTick(long millisUntilFinished);//这个是每次间隔指定时间的回调,millisUntilFinished:剩余的时间,单位毫秒 public abstract...1、空指针:如果在activity或者fragment关闭销毁的时候没有调用cancle方法,它的onTick方法还是会继续执行,这个时候UI控件都为空,不注意判断的话很容易空指针 2、时间不是太准的问题...: 我们看CountDownTimer的源码可以看到,在执行onTick的方法时,google源码里面减去了程序执行到这里的时候所消耗的时间,这里可以看出google代码的严谨 final long...的原理还是用到了Handler,所以很容易造成内存泄漏问题,当Activity或者Fragment关闭而倒计时还未结束的时候,会在后台一直执行,而很多时候我们用倒计时会有更新UI的操作,而控件都持有activity

1.2K20
  • countdown倒计时安卓软件_倒计时显示装置设计

    大家好,又见面了,我是你们的朋友全栈君。 实现原理 拿CountDownTimer的源代码看一下,并不复杂,基本上是对Handler的封装,使用send/post delay。...// handles counting down private Handler mHandler = new Handler() {...}; 作为一个私有的非静态成员变量,这段代码执行在构造方法中...(3)否则(这条逻辑分支是最关键的逻辑,实现onTick的循环调用): a)首先记下一个当前的时间戳,即本次执行onTick开始的时间; b)执行onTick(),注意,这里是同步执行; c)执行完onTick...总结一下,可以看出: (1)每次handleMessage的时候,实际上是以当前时间值为基础,计算一下剩余的时间并决定接下来的处理逻辑,这样做的目的显然是在现行Android Handler机制里面,无法保证以绝对准时的...(2)对于同步onTick的处理很严谨,考虑到了onTick可能的耗时操作。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    38530

    countdown timer plus_Android10使用

    最近博主需要实现一个倒计时相关的功能,被推荐了Android的CountDownTimer工具类,在此说一下CountDownTimer的使用以及源码的解读 以下是一个总计10秒倒计时,每间隔1秒进行回调的例子...便会调用onTick回调方法执行相应操作 当倒计时结束后,CountDownTimer会调用onFinish回调方法执行相应的操作 看完CountDownTimer的例子后,我们可以看一下CountDownTimer...的源码以加深对该工具类的理解,源码如下: public abstract class CountDownTimer { /** * Millis since epoch when alarm...作为一个抽象类,其主要方法有如下几个: start:开始进行倒计时 cancel:取消倒计时 onTick:抽象方法,用于倒计时间隔回调 onFinish:抽象方法,用于倒计时结束时回调 看过CountDownTimer...是基于Handler实现的,其处理以及发送message以及回调onTick处于同一线程,因此当我们在回调方法onTick耗时过多时,可能会影响CountDownTimer预估的回调次数(见源码144行

    54420

    (七十六) CountDownTimer

    看了api,其实这个类在定时的时间到了以后也会通知一下用户。 2....onTick()和onFinish()方法是抽象类,供调用方实现。...例子举完总结一下,就是剩余时间不够一次间隔了,那么就从消息处理开始等剩余时间走完发送最后的消息;如果剩余时间够一次间隔,就从消息处理开始等n个间隔发送消息,n取决于onTick的执行时长是时间间隔的多少倍向上取整...总结 使用CountDownTimer可以实现一些简单的固定间隔操作,定时结束后完成特定目标的需求(固定间隔定的是1s,但有可能是2s一刷新,取决于onTick执行时长),另外要注意其如果是在UI线程new...出来的,那么onTick和onFinish不要执行耗时操作。

    41320

    countdown倒计时安卓软件_倒计时工具

    CountDownTimer是Android官方SDK提供的一个倒计时工具,其仍然是基于Handler send/post delay,可视作在倒计时这个特定的使用场景下对于Handler的一种封装。...用法 CountDownTimer使用起来是很方便的。CountDownTimer是一个抽象类,通过构造方法创建实例,并且实现两个抽象方法即可。start()方法为启动倒计时。...(); 构造方法的两个参数均以毫秒为单位,第一个是倒计时总时长,第二个是收到tick回调的时间周期。...callbacks. */ 主线程中使用 值得注意的是,CountDownTimer可以在主线程中直接使用。...在工作线程中使用 不能在工作线程中像主线程一样简单使用的原因,是CountDownTimer是基于Handler的,细节将在原理部分说明。主线程已经由安卓框架层启动了消息循环,所以可以直接使用。

    60210

    countdowntimer的用法_offset counta函数

    大家好,又见面了,我是你们的朋友全栈君。 CountDownTimer类介绍 CountDownTimer类比较简单,总共就一个构造和4个方法。...CountDownTimer如果使用不当,常常会报空指针异常,甚至造成严重的内存泄漏 CountDownTimer的内部实现是采用Handler机制,通过sendMessageDelayed延迟发送一条...被回收时并未调用CountDownTimer的cancel()方法结束自己,这个时候CountDownTimer的Handler方法中如果判断到当前的时间未走完,那么会继续调用 sendMessageDelayed...(obtainMessage(MSG), delay); 触发 onTick(millisLeft); 当回调了Activity或者fragment中CountDownTimer的onTick...中的Handler方法还在继续执行,这一块空间始终无法被系统回收也就造成了内存泄漏问题 总结 1、在CountDownTimer的onTick方法中记得判空 activity中 if(MainActivity.this.isFinishing

    48220

    CountDownTimer

    CountDownTimer源码解析 在平时开发过程中我们可能需要一个倒计时来实现某个功能,这时候我们可以使用CountDownTimer来实现该功能 作用 可用于倒计时操作,内部采用Handler来实现的...首先我们使用构造函数创建CountDownTimer对象,需要传递两个参数,并实现两个抽象方法 构造函数 public CountDownTimer(long millisInFuture, long...(毫秒) countDownInterval: 设置每次减去的时间(毫秒) 创建对象 mCountDownTimer = new CountDownTimer(Long.MAX_VALUE, 5000...(long l):用于返回还剩余多长时间,每间隔一段时间回调一次 onFinish():当倒计时结束时回调 CountDownTimer通过start()来触发倒计时,那我们来看看里面是如何实现的...,若是则发送延时消息,延时时间为mCountdownInterval,否则延时时间为剩余时间,这样就实现了倒计时的功能 CountDownTimer通过cancel()来取消倒计时 /**

    51210

    android 倒计时控件_安卓倒计时

    CountDownTimer 构造函数: CountDownTimer (long millisInFuture, long countDownInterval) millisInfuture: 要倒计时的总时间...countDownInterval: 要倒计时的间隔时间, 单位ms。 CountDownTimer是个抽象类,在实际运用中我们会去构造一个匿名实现类对象来进行处理。...timer = object: CountDownTimer(5000, 1000){ override fun onTick(millisUntilFinished: Long) { logger.d...} override fun onFinish() { logger.d("time finished") } } 同时重写onTick()和onFinish()方法,其中onTick()是每过设置的间隔时间后的回调...最后在合适的时机调用下start()方法进行开启即可。 我们可以通过上面的代码写个小例子运行下,看看具体的运作流程: 通过上诉日志信息可以看到,倒计时的次数就是调用onTick()的次数。

    1.3K10

    android倒计时功能的实现(CountDownTimer)

    大家好,又见面了,我是你们的朋友全栈君。 在逛论坛的时候,看到一个网友提问,说到了CountDownTimer这个类,从名字上面大家就可以看出来,记录下载时间。...将后台线程的创建和Handler队列封装成一个方便的类调用。 查看了一下官方文档,这个类及其简单,只有四个方法,上面都涉及到了onTick,onFinsh、cancel和start。...下面是官方给的一个小例子: new CountdownTimer(30000, 1000) { public void onTick(long millisUntilFinished) {...,前者是倒计的时间数,后者是倒计时onTick事件响应的间隔时间,都是以毫秒为单位。...将后台线程的创建和Handler队列封装成为了一个方便的类调用。 当你想取消的时候使用mc.cancel()方法就行了。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    1.3K20

    Spring的cglib代理类无法取到被代理类的成员属性

    cglib的原理是生成一个被代理类的子类进行增强, 那么为什么子类访问不到父类的属性呢 @Service public class AopTestService { public String...根据aop代理规则, imTest方法可以被代理, 下面就是cglib生成的子类方法, 通过var10000.intercept代理拦截器, 最终使用源类AopTestService的对象去调用imTest...第二行: bool2为true, 因为noImTest方法被final修饰, 无法被代理增强, 所以最终是通过cglib生成的子类去调用父类AopTestService的noImTest方法....所以对象没有正常的初始化, 父类的value属性也就没有了 3. 第三行, this.getValue输出了....这个方法也是被子类重写了, 最终也是通过源类AopTestService的对象去调用对应方法, 所以能够输出 public final String getValue() { MethodInterceptor

    1.8K00

    Android开发笔记(五十)定时器AlarmManager

    Timer+TimerTask的实质是利用开启Thread来触发定时任务,所以TimerTask实际上运行于非UI线程,也就无法直接操作UI。...通常我们要自定义一个CountDownTimer的派生类,并重写如下的三个方法: 构造函数 : 第一个参数是总的计时长度,第二个参数是每次的计时间隔(好像时钟的滴答)。...onTick : 每次计时触发的事件。 onFinish : 计时结束事件。 要想启动CountDownTimer计时,调用它的start方法即可,停止计时则调用cancel方法。...PendingIntent类,PendingIntent顾名思义就是一个延迟处理的通信工具。...如果已存在描述的PendingIntent,则更新而不是取消该任务。 使用示例 下面是两种定时方式的效果图: ?

    3K10
    领券