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

标签 android multithreading firebase firebase-cloud-messaging android-lifecycle

由于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/

相关文章:

android - react native - 使用 PayPal v2/订单付款

angular - Ionic 和 Firebase - InvalidPipeArgument : '[object Object]' for pipe 'AsyncPipe'

ios - 如何循环遍历 Firebase 数据

java - 我在 Eclipse 中看到的内容与磁盘上的文件/目录之间的关系

java - Android Studio JUnit 纯 Java 测试

java - @Async 和 @Transactional 的 Spring 启动问题

c# - 为什么在 Threadlocal 委托(delegate)中初始化 threadstatic 属性不会为第一个线程初始化它?

javascript - DeprecationWarning : grpc. 改为加载 : Use the @grpc/proto-loader module with grpc. loadPackageDefinition

来自在线数据库的android可扩展列表

java - 与两个线程通信时,我必须使用管道吗?