2011-11-02 6 views
16

here(セクションCreating a Custom Notification Layout)のGoogleのサンプルを使用して、Androidアプリケーションでカスタム通知を使用しようとしています。 私はこの正確なコードを使用しているので、通知が発生するたびにRuntimeExceptionを数回取得しました。カスタム通知:java.lang.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()付き)標準的なものでカスタム通知を交換した場合、私は何の問題もありません。

答えて

5

私は最終的に解決策を見つけました。 私がしたのと同じRemoteViewオブジェクトを再利用することはできません! 私はonCreate()メソッドでRemoteViewを作成していましたが、notifyUpdateProgress()でその属性を設定していました。 オブジェクトを使用する直前にnotifyUpdateProgress()でオブジェクトを作成しても、もう例外はありません。

+1

ときどき私は新しいRemoteViewでもこのクラッシュを受けるので、それは@Brighamによって記述されたビットマップに関係すると思います。 – tokudu

+0

@ Brighamの答えは正しいです。あなたはあなたの 'RemoteView'の周りに' Bitmap'オブジェクトを漏らしているかもしれません。 –

18

この問題が発生した場合は、通知画像に使用しているビットマップのサイズを調べてください。

大きすぎる場合は、このエラーと、Androidシステム側のOutOfMemoryErrorが表示されることがあります。

+0

レイアウトにも設定されているアプリアイコン以外の画像は使用していません – DjHacktorReborn

関連する問題