Пользовательское уведомление: java.lang.RuntimeException: неверная длина массива - PullRequest
16 голосов
/ 03 ноября 2011

Я пытаюсь использовать пользовательские уведомления в своем приложении для Android, используя образец Google из здесь (раздел Создание пользовательского макета уведомлений ). Поскольку я использую этот точный код, я получаю RuntimeException каждые несколько раз, когда запускается уведомление.

Мой след стека:

FATAL EXCEPTION: main
java.lang.RuntimeException: bad array lengths
    at android.os.Parcel.readIntArray(Parcel.java:677)
    at android.app.INotificationManager$Stub$Proxy.enqueueNotificationWithTag(INotificationManager.java:369)
    at android.app.NotificationManager.notify(NotificationManager.java:110)
    at android.app.NotificationManager.notify(NotificationManager.java:90)
    at com.****.service.UpdateFeedService.notifyUpdateProgress(UpdateFeedService.java:266)
    at com.****.service.task.PodcastUpdaterTask.onProgressUpdate(PodcastUpdaterTask.java:63)
    at com.****.service.task.PodcastUpdaterTask.onProgressUpdate(PodcastUpdaterTask.java:1)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:432)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:144)
    at android.app.ActivityThread.main(ActivityThread.java:4937)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    at dalvik.system.NativeStart.main(Native Method)

Мой код:

private final Intent updateInProgressIntent = new Intent(this.context, PodcastListActivity.class);
private RemoteViews updateInProgressContentView = null;
private PendingIntent updateInProgressPendingIntent = null;
private Notification updateInProgressNotification = null;
...
    @Override 
    public void onCreate() { 
        super.onCreate();    
...
        this.updateInProgressPendingIntent = PendingIntent.getActivity(this, UPDATE_INPROGRESS_NOTIFICATION_ID, 
        this.updateInProgressIntent, PendingIntent.FLAG_UPDATE_CURRENT);     
        this.updateInProgressContentView = new RemoteViews(getPackageName(), R.layout.custom_notification);
...
    }

    public void notifyUpdateProgress(final int index, final int size, final Podcast podcast) {

        this.updateInProgressContentView.setImageViewBitmap(
                R.id.image, ActivityHelper.getBitmap(context, podcast.getThumbnailAsset()));
        this.updateInProgressContentView.setTextViewText(R.id.title, "some msg");
        this.updateInProgressContentView.setTextViewText(R.id.text, podcast.getName());
        this.updateInProgressNotification.contentView = this.updateInProgressContentView;       
        this.updateInProgressNotification.contentIntent = this.updateInProgressPendingIntent;               
        this.notificationManager.notify(UPDATE_INPROGRESS_NOTIFICATION_ID, this.updateInProgressNotification);

        ...
        }       

Если заменить пользовательское уведомление на стандартное (с setLatestEventInfo()), у меня нет проблем.

Ответы [ 2 ]

22 голосов
/ 15 мая 2012

Если вы видите эту проблему, изучите размер растрового изображения, которое вы используете для изображения уведомления.

Если оно слишком большое, вы можете увидеть эту ошибку, а также OutOfMemoryError на стороне системы Android.

7 голосов
/ 05 ноября 2011

Хорошо, так что я наконец-то нашел решение.

Вы не можете повторно использовать тот же RemoteView объект, как я!

Я создавал RemoteView в методе onCreate(), затем я устанавливал его атрибуты в notifyUpdateProgress().

Если я создам объект в notifyUpdateProgress() непосредственно перед его использованием, у меня больше не будет исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...