由于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_notif
和 fun()
串行运行,顺序无关紧要但并行不重要。
最佳答案
正如 parallel answer 中已经指出的那样, FirebaseMessagingService
的覆盖方法在后台线程中运行,因此您应该使用同步策略来访问/使用来自不同线程的可变对象。
但我要回答的问题有点不同。让我们暂时假设重写的方法在主线程上运行。那么有没有可能,执行顺序将是 STEP 1
然后STEP 2
然后 STEP 3
?
Android 使用一种称为 MessageQueue
的技术, 基本上有 Message
s 发布在那个队列上, Looper
循环并“解析/执行”它们。
现在,如果我们假设您当前位于 STEP 1
,这意味着有一个特定的 Message
当前正在执行(假设,我们假设操作是 - 执行此 Activity 的 onCreate()
)。
在完全执行此消息之前,不可能存在另一个 Message
这可能有机会被执行。因此,如果我们假设 Firebase 在后台线程上调度一个事件,但实际覆盖的方法正在主线程上运行,那么这个覆盖的方法将有机会仅在当前 Message
之后执行。 ( Activity 的 onCreate()
)已完成。换句话说,将发布另一个 Message
在 MessageQueue
上,这将执行 onMessageReceived()
当Looper
将有机会执行此消息。
因此,从理论上讲,排序不可能是 STEP 1
-> STEP 2
-> STEP 3
.
如果STEP 1
已经执行,那么它将继续 STEP 3
和 STEP 2
(在将来的某个时候,因为您无法知道 Message
上已经发布了哪些其他 MessageQueue
)。
参见 this article有关 MessageQueue
的更多详细信息和相关类(class)。
关于android - 推送通知能否与 UI 线程并行执行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50891869/