gpt4 book ai didi

android - 推送通知能否与 UI 线程并行执行代码?

转载 作者:行者123 更新时间:2023-11-29 16:40:27 26 4
gpt4 key购买 nike

由于FirebaseMessagingService 不使用Main Thread,我只是想知道我所有 Activity 或 fragment 中的所有代码都在UI thread(Main线程)。现在假设我的 Activity 的 onCreate 方法正在执行,然后我收到了 推送通知。这两个代码块会并行运行,还是推送通知代码会在队列中等待,直到 onCreate() 方法或 Activity 的最后一个生命周期方法被执行?

编辑- 正如您所说代码将并行运行那么假设我在 App.java 中有一个变量

public class App extends Application {
int ctr = 100;
}

StatusActivity.java

public class StatusActivity extends BaseActivity {
public void onCreate() {
fun();
}
public void fun() {
int d = App.ctr - 1;//Step 1 Here d = 99

int m = App.ctr - 1; // Step 3 Here m = 98

}

}

FcmListener.java

 public class FcmListener extends FirebaseMessagingService {
Override
public void onMessageReceived(RemoteMessage mssg) {
App.ctr = App.ctr - 1;//STEP 2 // Now App.ctr = 99

}
}

现在您可以在上面的代码中看到,如果推送通知代码与 fun() 并行执行,将会出现问题。我希望 push_notiffun() 串行运行,顺序无关紧要但并行不重要。

最佳答案

正如 parallel answer 中已经指出的那样, FirebaseMessagingService 的覆盖方法在后台线程中运行,因此您应该使用同步策略来访问/使用来自不同线程的可变对象。

但我要回答的问题有点不同。让我们暂时假设重写的方法在主线程上运行。那么有没有可能,执行顺序将是 STEP 1然后STEP 2然后 STEP 3

Android 使用一种称为 MessageQueue 的技术, 基本上有 Message s 发布在那个队列上, Looper 循环并“解析/执行”它们。

现在,如果我们假设您当前位于 STEP 1 ,这意味着有一个特定的 Message当前正在执行(假设,我们假设操作是 - 执行此 Activity 的 onCreate())。

在完全执行此消息之前,不可能存在另一个 Message这可能有机会被执行。因此,如果我们假设 Firebase 在后台线程上调度一个事件,但实际覆盖的方法正在主线程上运行,那么这个覆盖的方法将有机会仅在当前 Message 之后执行。 ( Activity 的 onCreate() )已完成。换句话说,将发布另一个 MessageMessageQueue 上,这将执行 onMessageReceived()Looper将有机会执行此消息。

因此,从理论上讲,排序不可能是 STEP 1 -> STEP 2 -> STEP 3 .

如果STEP 1已经执行,那么它将继续 STEP 3STEP 2 (在将来的某个时候,因为您无法知道 Message 上已经发布了哪些其他 MessageQueue )。

参见 this article有关 MessageQueue 的更多详细信息和相关类(class)。

关于android - 推送通知能否与 UI 线程并行执行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50891869/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com