android.os.TransactionTooLargeException для уведомления ForegroundService

Я пишу приложение для Android, которое отслеживает местоположение пользователя и показывает расстояние, время и стоимость поездки в уведомлении, все это отслеживается в файле ForegroundService. Сервис отслеживает местоположение, цену и время, и я обновляю уведомление каждую секунду. Я получаю это TransactionTooLargeException в производстве для самого первого обновления уведомлений, это происходит только на устройствах Samsung под управлением Android 8.0+.

Вот что происходит:

Я вызываю метод start из службы:

public void start(MeasureService service) {
    service.startForeground(NOTIFICATION_ID, getNotification(0, 0, 0));
}

Вызываю метод update из сервиса:

public void update(int price, float meters, long time) {
    mNotificationManager.notify(NOTIFICATION_ID, getNotification(price, meters, time));
}

На самом деле эти вызовы вызываются сразу один за другим, сбой происходит из-за метода update. Может ли это (вызов их друг за другом) быть проблемой?

это getNotification:

private Notification getNotification(int price, float meters, long seconds) {
    if (mNotificationBuilder == null) {
        createNotificationBuilder();
    }
    return mNotificationBuilder
            .setCustomContentView(getSmallView(price))
            .setCustomBigContentView(getBigView(price, seconds, meters))
            .build();
}

где методы getSmallView и getBigView выглядят так:

private RemoteViews getSmallView(int price) {
    String priceText = ...;
    mSmallView.setTextViewText(R.id.price, priceText);
    return mSmallView;
}

private RemoteViews getBigView(int price, long seconds, float meters) {
    String priceText = ...;
    String timeText = ...;
    String distanceText = ...;
    mBigView.setTextViewText(R.id.price, priceText);
    mBigView.setTextViewText(R.id.time, timeText);
    mBigView.setTextViewText(R.id.distance, distanceText);
    return mBigView;
}

и вот как я создаю notificationBuilder:

private void createNotificationBuilder() {
        NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW);
        ((NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel);
        mNotificationBuilder = new NotificationCompat.Builder(mContext, NOTIFICATION_CHANNEL_ID);

    mNotificationBuilder = mNotificationBuilder
            .setSmallIcon(R.drawable.icon)
            .setOngoing(true)
            .setContentIntent(getOpenMeasurePageIntent());
}

и getOpenMeasurePageIntent:

private PendingIntent getOpenMeasurePageIntent() {
    Intent launchMeasureIntent = new Intent(mContext, MainActivity.class);
    launchMeasureIntent.setAction(...);
    launchMeasureIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    return PendingIntent.getActivity(mContext, 0, launchMeasureIntent, 0);
}

Это журнал сбоев, который я получаю:

Caused by: java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 560988 bytes
16  at android.app.NotificationManager.notifyAsUser(NotificationManager.java:319)
17  at android.app.NotificationManager.notify(NotificationManager.java:284)
18  at android.app.NotificationManager.notify(NotificationManager.java:268)
19  at com.myapp.service.measure.MyNotification.void update(int,float,long) <- this is called from the timer

Я нашел много похожих проблем в Интернете, но обычно они связаны с передачей больших кусков данных в намерении, чего, как мне кажется, я не делаю.

Любая идея, что я могу делать неправильно?


person Analizer    schedule 20.08.2018    source источник
comment
Возможный дубликат stackoverflow.com/questions /22789588/   -  person rds    schedule 14.04.2019
comment
Вы пытались запустить службу переднего плана с обычным уведомлением (без удаленного просмотра)?   -  person Derek K    schedule 17.04.2019
comment
можете добавить журналы сбоев?   -  person Abdul Aziz    schedule 17.04.2019
comment
это обычно происходит, когда у вас есть большой объем передаваемых данных, поскольку вы часто обновляете уведомление, вам следует пытаться обновлять уведомление только тогда, когда есть фактические изменения, также взгляните на medium.com/@mdmasudparvez/, возможно, это поможет вам понять проблему ...   -  person Abdul Aziz    schedule 22.04.2019


Ответы (1)


Я думаю, что проблема в обновлении уведомлений каждую секунду.

Решение

Я предлагаю вам обновлять уведомление только тогда, когда данные лайки (расстояние, цена) изменились.

person Mayur Dabhi    schedule 10.04.2019
comment
Я обновляю его каждую секунду, потому что я показываю прошедшее время, но я округлю его до минут и попробую! - person Analizer; 10.04.2019
comment
вы можете использовать другой способ для прошедшего времени. Как обработчик всего этого - person Mayur Dabhi; 11.04.2019
comment
Мне все равно нужно было бы пройти время до уведомления в транзакции - person Analizer; 11.04.2019
comment
Существует виджет хронометра, который можно использовать для подсчета ЧЧ:ММ:СС в удаленные просмотры. На Android 6+ он также может вести обратный отсчет. - person Eugen Pechanec; 16.04.2019