android - 如何在 Android FirebaseMessagingService 中创建倒计时?
问题描述
我正在尝试在 FirebaseMessagingService 中创建倒计时,如下所示:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
CountDownTimer countDownTimer;
long timerLeft = 5000;
public void onMessageReceived(RemoteMessage remoteMessage) {
startTimer();
}
public void startTimer() {
countDownTimer = new CountDownTimer(timerLeft, 1000) {
public void onTick(long millisUntilFinished) {
timerLeft = millisUntilFinished;
Log.d("timerleft: ",""+timerLeft);
}
public void onFinish() {
timerLeft=10000;
}
}.start();
}
但是当我收到消息时,我有这个错误:
java.lang.RuntimeException: Can't create handler inside thread Thread[Firebase-Messaging-Intent-Handle,5,main] that has not called Looper.prepare()
我该如何解决?
解决方案
Looper.prepare()
您可以在创建之前随时收听日志并调用new CountDownTimer
,但我建议您使用一些调度机制,例如WorkManager
or AlarmManager
。这取决于你想在柜台完成后实现什么
由于评论而编辑:
public void onMessageReceived(RemoteMessage remoteMessage) {
long lastMsgTimestamp = PreferenceManager.getDefaultSharedPreferences(this).
getLong("lastMsgTimestamp", 0L);
AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent pi = getPendingIntent(this);
if(lastMsgTimestamp + 5000 >= System.currentTimeMillis()) {
mgr.cancel(pi);
}
mgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 5000, pi);
PreferenceManager.getDefaultSharedPreferences(this).edit().
putLong("lastMsgTimestamp", System.currentTimeMillis()).apply();
}
private static PendingIntent getPendingIntent(Context ctx){
Intent i = new Intent(ctx, FiveSecsBroadcast.class);
return PendingIntent.getBroadcast(ctx, 0, i, 0);
}
FiveSecsBroadcast
是一个BroadcastReceiver
将在 5 秒后触发(onReceive
方法)。Bundle
您可以使用extras传递一些数据Intent
推荐阅读
- python - 如何重复向客户端发送数据?
- python - 使用 Python、BeautifulSoup 进行网页抓取
- amazon-web-services - AWS 账户和限界上下文
- php - 如何使用 php 自动删除我的 mysql 表中的所有记录?
- javascript - Express JS 处理多个请求并将响应返回给发出请求的浏览器
- reactjs - 从 React 项目中移除 ESLint
- amazon-product-api - 如何获取 AWS 调用的签名
- git - 如何在 Docker Alpine 上构建 Git 时减小 Git 二进制文件的大小?
- linkedin - LinkedIn 问题共享 : 删除您的附件以从其他帐户发布
- authentication - 在 Blazor 服务器中刷新页面后,登录的用户未经过身份验证