android - 具有延迟操作的处理程序 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 本身的代码非常相似,但我不理解这种延迟操作的原因,任何人都可以说出它为什么会这样吗?
解决方案
推荐阅读
- python - 如何在 Python 中接收 Twitch.tv Webhooks?
- python - 计算没有矩阵的余弦相似度,从 coo_matrix 到 csr_matrix
- javascript - 如何打破javascript对象引用
- android - Firebase 和 Google-Auth 和 Phone-Auth 的 SHA-1 问题
- php - 在 PHP 中创建会话,然后在 JSP 中检查该会话
- python - Python stringTypeError:必须是 str,而不是 NoneType
- javascript - 如何从 SVG 标签内控制 HTML 元素
- rust - 如何在这个结构定义中避免 PhantomData?
- solr - SolrCloud 的 SolrJ 客户端针对响应速度进行了优化?
- swift - IOS UILabel 在我重新加载应用程序或单击其他位置之前不会更新