代码之家  ›  专栏  ›  技术社区  ›  Dewey Reed

RemoteServiceException:startForeground:java的错误通知。util。ConcurrentModificationException

  •  0
  • Dewey Reed  · 技术社区  · 7 年前
    android.app.RemoteServiceException: Bad notification for startForeground: java.util.ConcurrentModificationException
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2204)
      at android.os.Handler.dispatchMessage(Handler.java:108)
      at android.os.Looper.loop(Looper.java:166)
      at android.app.ActivityThread.main(ActivityThread.java:7523)
      at java.lang.reflect.Method.invoke(Method.java:-2)
      at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
    

    我收到这个坠机报告已经有一段时间了。这似乎只发生在Android 8.0.0上。

    @Synchronized
    override fun toForeground(id: Int) {
        fun action() {
            startForeground(id, builder?.build())
        }
        if (Looper.myLooper() === Looper.getMainLooper()) {
            action()
        } else {
            Handler(Looper.getMainLooper()).post { action() }
        }
    }
    

    每个频道都已设置好,该应用程序可以在Android 8.0.0及更高版本的设备上运行,在测试过程中没有任何问题,但我无法重现崩溃。

    我想知道为什么会发生这种崩溃,以及如何修复它。

    提前谢谢。

    0 回复  |  直到 7 年前
        1
  •  5
  •   zoulou    7 年前

    我也会在安卓8.0.0设备上随机面临崩溃。

    查看AOSP源代码,它似乎是由这行代码产生的: http://androidxref.com/8.0.0_r4/xref/frameworks/base/services/core/java/com/android/server/am/ServiceRecord.java#540 :

    public void postNotification() {
    ...
    } catch (RuntimeException e) {
        Slog.w(TAG, "Error showing notification for service", e);
        // If it gave us a garbage notification, it doesn't
        // get to be foreground.
        ams.setServiceForeground(name, ServiceRecord.this,
                0, null, 0);
        ams.crashApplication(appUid, appPid, localPackageName, -1,
                "Bad notification for startForeground: " + e);
    }
    

    不确定这个catch块上面的try块中到底是哪一行导致了它,但我假设AOSP本身有一个bug。它与通知异步操作。 因此,当AOSP也在其上运行时,应用程序更新其通知的可能性相当高。

        2
  •  1
  •   user924    5 年前

    华为?对我来说,只有Firebase Crashlytics中的华为设备有报道。所以这可能是制造业的失败。一个非常糟糕的设备 https://dontkillmyapp.com/huawei

        3
  •  0
  •   Dewey Reed    6 年前

    我的应用程序有时会更改前台通知。在我使用下面的代码之后,我已经有一段时间没有看到崩溃了。但我 不确定 它可以修复所有场景。

    private val toForegroundHandler: Handler = Handler(Looper.getMainLooper())
    
    @Synchronized
    override fun toForeground(id: Int) {
        toForegroundHandler.removeCallbacksAndMessages(null)
        toForegroundHandler.postDelayed(16) {
            startForeground(id, builder.build())
        }
    }