Android 使用flow实现倒计时的方式
作者:i小灰 时间:2023-04-13 10:36:29
Android 倒计时一般实现方式:
handler+postDelayed() 方式
Timer + TimerTask + handler 方式
ScheduledExecutorService + handler 方式
RxJava 方式
CountDownTimer 方式
现在因为有了协程和Flow,我们可以借助Flow这个工具,更加优雅地实现这个需求功能.
1.依赖导入
api 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2'
api 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1'
// lifecycleScope(可选)
api "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
2. 代码实现
fun countDownCoroutines(
total: Int,
scope: CoroutineScope,
onTick: (Int) -> Unit,
onStart: (() -> Unit)? = null,
onFinish: (() -> Unit)? = null,
): Job {
return flow {
for (i in total downTo 0) {
emit(i)
delay(1000)
}
}.flowOn(Dispatchers.Main)
.onStart { onStart?.invoke() }
.onCompletion { onFinish?.invoke() }
.onEach { onTick.invoke(it) }
.launchIn(scope)
}
2.1使用:
private var mCountdownJob: Job? = null
mBinding.btnStart.setOnClickListener {
mCountdownJob = countDownCoroutines(60, lifecycleScope,
onTick = { second ->
mBinding.text.text = "${second}s后重发"
}, onStart = {
// 倒计时开始
}, onFinish = {
// 倒计时结束,重置状态
mBinding.text.text = "发送验证码"
})
}
mBinding.btnStop.setOnClickListener {
// 取消倒计时
mCountdownJob?.cancel()
其他的完整Demo https://github.com/dahui888/kotlinpractice
补充:
下面是小编收集整理Android 实现倒计时的几种方式
使用 Timer方式:
/**
* 开始
*/
public void startTimer() {
if (timer == null) {
timer = new Timer();
}
if (timerTask == null) {
timerTask = new TimerTask() {
@Override
public void run() {
Message message = new Message();
message.what = 2;
handler.sendMessage(message);
}
};
}
if (timer != null && timerTask != null) {
timer.schedule(timerTask, 0, 2000);
}
}
/**
* 暂停定时器
*/
public void stopTimer() {
if (timer != null) {
timer.cancel();
timer = null;
}
if (timerTask != null) {
timerTask.cancel();
timerTask = null;
}
}
使用rxjava方式:
private void countDown() {
mdDisposable = Flowable.intervalRange(0, Constant.COUNT_DOWN, 0, 1,TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext((aLong) -> LogUtils.e("倒计时--" + aLong))
.doOnComplete(() -> randomSelectSeat())
.subscribe();
}
/**
* 销毁
*/
@Override
protected void onDestroy() {
if (mdDisposable != null) {
mdDisposable.dispose();
}
super.onDestroy();
}
使用CountDownTimer方式:
//倒计时CountDownTimer
//每过1000毫秒执行一次onTick
//倒计时完成执行onFinish
CountDownTimer timer = new CountDownTimer(5000, 1000){
@Override
public void onTick(long sin) {
Toast.makeText(MainActivity.this, "" + sin/1000, Toast.LENGTH_SHORT).show();
}
@Override
public void onFinish() {
Toast.makeText(MainActivity.this, "倒计时完成", Toast.LENGTH_SHORT).show();
}
};
//开始
timer.start();
//暂停
if (timer != null) {
timer.cancel();
timer = null;
}
来源:https://juejin.cn/post/7011018975333056519
标签:android,flow,倒计时
0
投稿
猜你喜欢
解决IDEA service层跳转实现类的快捷图标消失问题
2022-09-03 06:38:00
Android 显示和隐藏输入法实现代码
2023-03-29 06:42:39
springboot配置mysql数据库spring.datasource.url报错的解决
2023-10-04 12:49:26
深入解析Java的Hibernate框架中的一对一关联映射
2022-08-07 22:23:39
SpringBoot项目的测试类实例解析
2021-05-29 20:35:04
有关Java中的BeanInfo介绍
2023-08-05 00:13:42
Java实现的RSA加密解密算法示例
2022-05-03 09:20:38
Java基于JDK 1.8的LinkedList源码详析
2021-07-15 03:29:26
Android 中 viewpager 滑动指示器的实例代码
2022-06-30 19:43:06
C++的函数与指针
2022-12-20 14:08:15
C# ListBox中的Item拖拽代码分享
2022-04-12 14:06:41
java 过滤器filter防sql注入的实现代码
2023-08-30 09:56:40
教你5分钟轻松搞定内存字节对齐
2022-05-03 08:35:10
C#创建windows系统用户的方法
2022-07-16 20:30:12
Flutter实现底部导航栏
2023-05-18 15:10:26
IDEA中使用Typora编辑md文件的方法
2022-11-28 09:50:47
C#通过指针实现快速拷贝的方法
2022-09-26 01:43:08
JAVA简单工厂模式(从现实生活角度理解代码原理)
2021-10-29 12:39:32
Java实现单链表反转的多种方法总结
2023-11-11 02:28:08
通过JDK源码角度分析Long类详解
2022-03-11 19:26:38