首页 > 解决方案 > 如何在 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()

我该如何解决?

标签: androidfirebasefirebase-cloud-messagingruntimeexceptionandroid-looper

解决方案


Looper.prepare()您可以在创建之前随时收听日志并调用new CountDownTimer,但我建议您使用一些调度机制,例如WorkManageror 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


推荐阅读