自定义通知:java.lang.RuntimeException:错误的数组长度

Posted

技术标签:

【中文标题】自定义通知:java.lang.RuntimeException:错误的数组长度【英文标题】:Custom notification: java.lang.RuntimeException: bad array lengths 【发布时间】:2011-12-20 17:48:20 【问题描述】:

我正在尝试使用来自here(Creating a Custom Notification Layout 部分)的 Google 示例在我的 android 应用程序中使用自定义通知。 因为我使用的是这个确切的代码,所以我每隔几次就会收到一个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())替换自定义通知,我没有问题。

【问题讨论】:

【参考方案1】:

好的,所以我终于找到了解决方案。

您不能像我一样重复使用相同的 RemoteView 对象!

我在onCreate() 方法中创建RemoteView,然后在notifyUpdateProgress() 中设置它的属性。

如果我在使用它之前在notifyUpdateProgress() 中创建对象,我将不再有异常。

【讨论】:

有时即使使用全新的 RemoteView 也会发生崩溃,所以我认为它与@Brigham 提到的位图有关 @Brigham 的回答是正确的。您可能在您的RemoteView 周围泄漏了Bitmap 对象。【参考方案2】:

如果您遇到此问题,请调查您用于通知图像的位图的大小。

如果它太大,您可能会看到此错误,以及 Android 系统端的 OutOfMemoryError

【讨论】:

m 除了在布局中设置的应用图标外,没有使用任何图像

以上是关于自定义通知:java.lang.RuntimeException:错误的数组长度的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Galaxy S21 没有自定义通知声音

如何获取所有应用程序的所有通知都运行自定义通知

Appcelerator Titanium 中的自定义通知视图

自定义通知中心

自定义通知托盘不适用于某些手机

ios 的 FCM 自定义通知