2017-02-12 59 views
0

我正在開發音樂播放器,並使用音頻文件中的圖片將其顯示在我的應用的用戶界面中,如果我非常快速地更改音樂(上一個,下一個按鈕),那麼我可以得到java.lang.RuntimeException: Canvas: trying to use a recycled bitmap,但是如果我非常快地改變音樂,Play市場上的流行玩家就不會遇到這個問題。我怎樣才能避免這個錯誤,以及在其他音樂應用程序?EmbeddedPicture&java.lang.RuntimeException:Canvas:試圖使用回收的位圖

具有相同的錯誤類似的問題沒有幫助我

MediaService類

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類

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

你已經把兩個代碼示例。你在使用哪一個?每個代碼示例面臨的錯誤是什麼? – Dibzmania

回答

0

我決定用AsyncTask和取消執行(mImageViewAsync.cancel(true);)爲創建並執行新實例時的當前實例,因此在這種情況下,onPostExecute被觸發小於doInBackground,所以現在應用程序很難崩潰(但它仍然可以在某些情況下,但它並不重要)

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); 
     } 
    } 
相關問題