首页 > 解决方案 > 具有延迟操作的处理程序 post(Runnable r)

问题描述

因此,我正在尝试实现一个功能,使我的 sip 电话应用程序在接到电话后唤醒并向服务器发送注册信息,如果它处于睡眠状态,它会发送推送通知。我正在使用 Linphone 库来实现这种方式。

这是通过一个名为 dispatchOnUIThread(Runnable r) 的方法完成的,该方法应该使用其类中的处理程序并发布所述可运行的。runnable 本身实现了在收到推送并确定注册是否处于活动状态后要执行的操作,如下所示:

在 LinphoneUtils 类上:

public final class LinphoneUtils {
private static final Handler sHandler = new Handler(Looper.getMainLooper());

  public static void dispatchOnUIThread(Runnable r) {
      sHandler.post(r);
  }
}

它被称为:

public void onMessageReceived(RemoteMessage remoteMessage) {
  LinphoneUtils.dispatchOnUIThread(mPushReceivedRunnable);
}

以及 mPushReceivedRunnable 的实现:

private Runnable mPushReceivedRunnable =
        new Runnable() {
            @Override
            public void run() {
                if (!LinphoneContext.isReady()) {
                    new LinphoneContext(getApplicationContext());
                    LinphoneContext.instance().start(true);
                } else {
                    Log.i(TAG, "[Push Notification] Notifying Core");
                    if (LinphoneManager.getLcIfManagerNotDestroyedOrNull() != null && LinphoneManager.getLc().getCallsNb() == 0) {
                        LinphoneCore core = LinphoneManager.getLc();
                        if (core != null) {
                            core.setNetworkReachable(true);
                            core.refreshRegisters();
                        }
                    }
                }
            }
        };

问题是,如果注册未激活,在推送通知之后的 dispatchOnUIThread 方法之后,应用程序在收到第二次推送之前不会向服务器发送注册,在这种情况下,它会发送应该遵循的注册第一次推送和发送第二次推送的通话邀请。

该代码与 Linphone 本身的代码非常相似,但我不理解这种延迟操作的原因,任何人都可以说出它为什么会这样吗?

标签: androidpush-notificationandroid-handlerlinphone

解决方案


推荐阅读