2017-02-12 2 views
0

Ich entwickle Musik-Player und ich verwende Bild von Audio-Dateien, die es in UI meiner App angezeigt werden, wenn ich Musik sehr schnell ändern (iV, nächster Knopf) dann kann ich java.lang.RuntimeException: Canvas: trying to use a recycled bitmap bekommen, aber populäre Spieler vom Spielmarkt haben dieses Problem nicht, wenn ich Musik sehr schnell ändere. Wie kann ich diesen Fehler sowie andere Musik-Apps vermeiden?EmbeddedPicture & java.lang.RuntimeException: Leinwand: Der Versuch, eine Recycling-Bitmap zu verwenden

ähnliche Frage mit dem gleichen Fehler hat mir nicht geholfen

Media Klasse

MediaMetadataRetriever mMetaRetriever = new MediaMetadataRetriever(); 
    mMetaRetriever.setDataSource(songPath); 
    byte[] art = mMetaRetriever.getEmbeddedPicture(); 
    Bitmap iconUrl = null; 
    try { 
     if (art != null) { 
      iconUrl = BitmapFactory.decodeByteArray(art, 0, art.length); 
     } 
    } catch (Exception e) { 

    } 

UI-Klasse

try { 
     // with or without it error happens anyway 
     /*if (mBitmap != null && !mBitmap.isRecycled()) { 
      mBitmap.recycle(); 
      mBitmap = null; 
      mLogo.setImageBitmap(null); 
     }*/ 
     mBitmap = metadata.getBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART); 
     mLogo.setImageBitmap(mBitmap); 
    } catch (Exception e) { 

    } 
+0

Sie zwei Beispielcode zugewiesen sind. Welchen benutzen Sie? Welchen Fehler sehen Sie bei jedem Codebeispiel? – Dibzmania

Antwort

0

Ich habe gerade beschlossen, AsyncTask zu verwenden und Abbrechen der Ausführung (mImageViewAsync.cancel(true);) für aktuelle Instanz, wenn eine neue Instanz erstellt und ausgeführt wird, so wird in diesem Fall onPostExecute weniger alsausgelöst, es jetzt schwierig für App zum Absturz zu bringen (aber es in einigen Fällen immer noch, aber es ist nicht wichtig, so)

private ImageViewAsync mImageViewAsync; 

    private void updateMetaData(MediaMetadataCompat metadata) { 
     //... 
     mLogo.setImageBitmap(null); 
     if (mImageViewAsync != null) { 
      mImageViewAsync.cancel(true); 
     } 

     mImageViewAsync = new ImageViewAsync(); 
     mImageViewAsync.execute(metadata); 
    } 

    private class ImageViewAsync extends AsyncTask<MediaMetadataCompat,Void,Bitmap> { 

     @Override 
     protected Bitmap doInBackground(MediaMetadataCompat... meta) { 
      return meta[0].getBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART); 
     } 

     @Override 
     protected void onPostExecute(Bitmap bitmap) { 
      mLogo.setImageBitmap(bitmap); 
     } 
    } 
Verwandte Themen