0

ミュージックアプリケーションでアルバムアートを直接表示すると、アートワークがハングアップします。 stackoverflowでは、誰かが私にAsyncTaskの実装を提案しました。そこで、AsyncTaskを実装して、私のアプリをより速くしました。今、私のアプリはぶら下がっていませんが、正しいアルバムアートを表示していません。アルバムアートは、リストビューをスクロールすると頻繁に変化するランダムな手段です。AsyncTaskクラスを使用すると、アルバムアートが正しく表示されない

私を助けてください。ここで

はAsyncTaskクラスです:リストビューで曲を表示する

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { 
    private final WeakReference<ImageView> imageViewReference; 
    private int data = 0; 
    private long l; 

    public BitmapWorkerTask(ImageView imageView) { 
     // Use a WeakReference to ensure the ImageView can be garbage collected 
     imageViewReference = new WeakReference<ImageView>(imageView); 
    } 

    public BitmapWorkerTask(ImageView imageView, long l) { 
     // Use a WeakReference to ensure the ImageView can be garbage collected 
     imageViewReference = new WeakReference<ImageView>(imageView); 
     this.l = l; 
    } 

    // Decode image in background. 
    @Override 
    protected Bitmap doInBackground(Integer... params) { 
     //Bitmap art = getAlbumart(songlist.this, l); 
     Context context = songlist.this; 
     Bitmap bm = null; 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     try { 
      final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart"); 
      Uri uri = ContentUris.withAppendedId(sArtworkUri, l); 
      ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r"); 
      if (pfd != null) { 
       FileDescriptor fd = pfd.getFileDescriptor(); 
       bm = BitmapFactory.decodeFileDescriptor(fd, null, options); 
       pfd = null; 
       fd = null; 
      } 
     } catch (Error ee) { 
     } catch (Exception e) { 
     } 
     return bm; 
    } 

    // Once complete, see if ImageView is still around and set bitmap. 
    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     if (imageViewReference != null && bitmap != null) { 
      final ImageView imageView = imageViewReference.get(); 
      if (bitmap != null) { 
       iv_art.setImageBitmap(bitmap); 
      } else { 
       iv_art.setImageResource(R.mipmap.app_splash_screen_icon); 
      } 
     } 
    } 
} 

私のクラス:

public class MediaCursorAdapter extends SimpleCursorAdapter { 

    String backgroundColor = "white"; 
    String someOtherBackgroundColor = "#FAFAFA"; 

    public MediaCursorAdapter(Context context, int layout, Cursor c) { 
     super(context, layout, c, 
       new String[]{MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.TITLE, MediaStore.Audio.AudioColumns.DURATION, MediaStore.Audio.Media.ALBUM_ID}, 
       new int[]{R.id.displayname, R.id.title, R.id.duration, R.id.iv_art}); 
    } 



    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 


     if (cursor.getPosition() % 2 == 0) { 
      view.setBackgroundColor(
        Color.parseColor(backgroundColor)); 
     } else { 
      view.setBackgroundColor(
        Color.parseColor(someOtherBackgroundColor)); 
     } 


     TextView title = (TextView) view.findViewById(R.id.title); 
     TextView name = (TextView) view.findViewById(R.id.displayname); 
     TextView duration = (TextView) view.findViewById(R.id.duration); 
     iv_art = (ImageView) view.findViewById(R.id.iv_art); 


     String a = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)); 


     l = Long.parseLong(a); 

     bwc = new BitmapWorkerTask(iv_art,l); 

     bwc.execute(); 

     long durationInMs = Long.parseLong(cursor.getString(
       cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DURATION))); 

     name.setText(cursor.getString(
       cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME))); 

     title.setText(cursor.getString(
       cursor.getColumnIndex(MediaStore.MediaColumns.TITLE))); 

     Utility d = new Utility(); 

     String durationInMin = d.convertDuration(durationInMs); 

     duration.setText("" + durationInMin); 

     view.setTag(cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DATA))); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     LayoutInflater inflater = LayoutInflater.from(context); 
     View v = inflater.inflate(R.layout.songlist_listitem, parent, false); 

     bindView(v, context, cursor); 

     return v; 
    } 
} 

答えて

1

そのため、行の並べ替えの。フェッチを開始したときに読み込むイメージビューは、必ずしも最後にロードしたい場所ではありません。弱い参照は、ビューが破壊されていないため、右のものではなくちょうど役に立たない。

ビューに直接データをロードする代わりに、キャッシュに格納してからnotifyDataSetChangedを呼び出します。行をバインドするときに、イメージがキャッシュされているかどうかを確認して確認します。そうなら、それを使用してください。そうでない場合は、要求を送信します。これにより、表示される問題の大半が修正され、OOMエラーが防止されます(キャッシュに最大限のメモリ使用量を設定できます)。

また、このすべてを行うライブラリをVolleyのように使用してください。

+0

この問題はビットマップ@Gabeをキャッシュしても解決されません – Pedo

関連する問題