2017-10-18 188 views
0

我按照http://frescolib.org/docs/images-in-notifications.html中的示例詳細說明了如何從網絡加載圖像並將其設置爲通知。當使用Fresco將圖像加載到通知中時,不能包含回收的位圖錯誤

這裏是我的代碼演示相同:

private void fetchNotificationImage(String image) { 
     ImageRequest imageRequest = ImageRequest.fromUri(image); 
     ImagePipeline pipeline = Fresco.getImagePipeline(); 
     com.facebook.datasource.DataSource<CloseableReference<CloseableImage>> dataSource = pipeline.fetchDecodedImage(imageRequest, null); 
     dataSource.subscribe(new BaseBitmapDataSubscriber() { 
           @Override 
           protected void onNewResultImpl(Bitmap bitmap) { 
            artwork = bitmap; 
            updateNotification(); 

            mediaSession.setMetadata(new MediaMetadataCompat.Builder().putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bitmap).build()); 
           } 

           @Override 
           protected void onFailureImpl(com.facebook.datasource.DataSource<CloseableReference<CloseableImage>> dataSource) { 
            artwork = BitmapFactory.decodeResource(getResources(), R.drawable.empty_album); 

            updateNotification(); 

            mediaSession.setMetadata(new MediaMetadataCompat.Builder().putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, artwork).build()); 
           } 
          }, 
       UiThreadImmediateExecutorService.getInstance()); 
    } 

updateNotification方法如下:

private void updateNotification() { 
     NotificationCompat.Action playPauseAction = playbackState.getState() == PlaybackStateCompat.STATE_PLAYING ? 
       createAction(R.drawable.ic_music_pause, "Pause", ACTION_PAUSE) : 
       createAction(R.drawable.ic_music_play, "Play", ACTION_PLAY); 

     setPlaybackState(playbackState.getState()); 

     Bitmap largeIcon = artwork != null ? artwork : BitmapFactory.decodeResource(getResources(), R.drawable.empty_album); 

     Notification notification = new NotificationCompat.Builder(this) 
       .setPriority(Notification.PRIORITY_DEFAULT) 
       .setContentTitle(songTitle) 
       .setContentText(songArtist) 
       .setShowWhen(false) 
       .setSmallIcon(R.drawable.ic_stat_playing) 
       .setLargeIcon(largeIcon) 
       .addAction(createAction(R.drawable.ic_action_previous, "Previous", ACTION_PREVIOUS)) 
       .addAction(playPauseAction) 
       .addAction(createAction(R.drawable.ic_action_next, "Next", ACTION_SKIP)) 
       .setStyle(new NotificationCompat.MediaStyle() 
         .setMediaSession(mediaSession.getSessionToken()) 
         .setShowActionsInCompactView(1, 2)) 
       .setContentIntent(startPendingIntent()) 
       .build(); 

     startForeground(1, notification); 
    } 

它運作良好,在大多數情況下。但是,我偶爾會得到Can't parcel a recycled bitmap exception。這是完整的錯誤日誌:

Fatal Exception: java.lang.IllegalStateException: Can't copy a recycled bitmap 
     at android.graphics.Bitmap.checkRecycled(Bitmap.java:400) 
     at android.graphics.Bitmap.createAshmemBitmap(Bitmap.java:713) 
     at android.graphics.drawable.Icon.convertToAshmem(Icon.java:391) 
     at android.app.Notification$Builder.build(Notification.java:3906) 
     at android.support.v4.app.NotificationCompatApi21$Builder.build(NotificationCompatApi21.java:127) 
     at android.support.v4.app.NotificationCompat$BuilderExtender.build(NotificationCompat.java:620) 
     at android.support.v4.app.NotificationCompat$NotificationCompatApi21Impl.build(NotificationCompat.java:853) 
     at android.support.v4.app.NotificationCompat$Builder.build(NotificationCompat.java:1861) 
     at com.radioafrica.music.service.MusicService.updateNotification(MusicService.java:890) 
     at com.radioafrica.music.service.MusicService.access$600(MusicService.java:140) 
     at com.radioafrica.music.service.MusicService$1.onPlayFromUri(MusicService.java:536) 
     at android.support.v4.media.session.MediaSessionCompat$Callback$StubApi23.onPlayFromUri(MediaSessionCompat.java:1414) 
     at android.support.v4.media.session.MediaSessionCompatApi23$CallbackProxy.onPlayFromUri(MediaSessionCompatApi23.java:41) 
     at android.media.session.MediaSession$CallbackMessageHandler.handleMessage(MediaSession.java:1216) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:7409) 
     at java.lang.reflect.Method.invoke(Method.java) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

如何使用Fresco使得它加載一個新的形象,以通知的時候從來沒有產生這個錯誤我建我的通知?

回答

0

檢查以下內容:

Bitmap largeIcon = (artwork != null && !artwork.isRecycled()) ? artwork : BitmapFactory.decodeResource(getResources(), R.drawable.empty_album); 

創建你的圖標,因爲我懷疑你的作品beeing不爲空,但在你的代碼的一部分回收,我們不能看到

相關問題