2017-02-12 1 views
0

음악 플레이어를 개발 중이며 음악을 매우 빠르게 변경하면 오디오 파일의 그림을 내 앱의 UI에 표시합니다 (이전, 다음 버튼을 클릭하면) java.lang.RuntimeException: Canvas: trying to use a recycled bitmap을 얻을 수 있지만, 음악을 매우 빠르게 변경하면 Play 시장의 유명 플레이어가이 문제를 겪지 않습니다. 다른 음악 앱과 마찬가지로이 오류를 피하려면 어떻게해야합니까?EmbeddedPicture & java.lang.RuntimeException : 캔버스 : 재활용 비트 맵을 사용하려고합니다

같은 오류와

비슷한 질문은 나에게 도움이되지 않았다

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) { 

    } 

난 그냥 AsyncTask를 사용하고 실행 (mImageViewAsync.cancel(true);)를 취소하기로 결정

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

UI 클래스 현재 인스턴스가 생성되고 실행될 때이 경우 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); 
     } 
    } 
관련 문제