FirebaseInstanceIdReceiver 上出现 ANR

Suj*_*ana 2 android firebase firebase-cloud-messaging

我在我的游戏控制台中收到以下错误,没有任何堆栈跟踪(在 android 7 和 10 上)。

Broadcast of Intent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10000010 pkg=com.mycompany.myapp cmp=com.mycompany.myapp/com.google.firebase.iid.FirebaseInstanceIdReceiver (has extras) }
Run Code Online (Sandbox Code Playgroud)

使用的 Firebase 版本,

 implementation 'com.google.firebase:firebase-iid:21.1.0'
 implementation 'com.google.firebase:firebase-messaging:23.0.6'
Run Code Online (Sandbox Code Playgroud)

我不知道我的代码的哪一部分到底导致了这个错误,我发布了负责上传到FCM token我的服务器的代码。

我的Firebase消息服务,

 @Override
    public void onNewToken(@NonNull String s) {
        super.onNewToken(s);
       new TokenUploader().setFcmToken();//send to server
    }

Run Code Online (Sandbox Code Playgroud)

TokenUploader类

    //this function is called from MyFirebaseMessagingService and MainActivity
    public void setFcmToken() {
        FirebaseMessaging.getInstance().getToken().addOnCompleteListener(task -> {
            if (task.isSuccessful()) new Thread(() -> pushFcmToken(task.getResult())).start();
            else if (task.getException() != null)
                new Thread(() -> pushFcmToken(task.getException().getMessage())).start();
        });
    }


    //push token to server
    private void pushFcmToken(String token) {
        if (account == null) return;
        try {
            JSONObject params = new JSONObject();
            params.put("email", account.getEmail());
            params.put("password", getPassword());
            params.put("key", getApiKey());
            params.put("fcm_token", token);
            JSONObject obj = null;
            for (int i = 0; i < 4; i++) {//try 4 times
                obj = sendRequestToApi("POST", params, "/fcm_route");
                if (obj != null && obj.has("fcmId")) break;//successfully uploaded
            }
            
        } catch (Exception e) {
           
        }
    }


Run Code Online (Sandbox Code Playgroud)

我坚信我在这里做错了什么,因为很多设备未能将其令牌上传到我的服务器。如何防止上述错误并获得 100% 上传 token 的成功率?

luk*_*jar 6

这些 ANRact=com.google.android.c2dm.intent.RECEIVE在发送大量推送通知的 Android 应用程序中非常常见。

其中大多数是由长时间的应用程序启动和在主线程上处理推送通知引起的。
Bumble Tech 的 Nickolay Chameyev 在文章中对此进行了很好的描述:我们如何实现 ANR 减少 6 倍 - 第 2 部分:修复 ANR

  • 每个应用程序都是不同的,启动时间长的原因有很多。在本文中,您还可以找到一些如何改进它的技巧。如果应用程序类中没有任何可疑之处,那么您可以检查某些初始化程序/内容提供程序的清单。如果您使用 hilt,您可以检查您创建的依赖项的范围。如果我们想缩短启动时间,我们应该避免 Singleton 范围 (2认同)