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); 
      } 
     } 
    } 
} 

Мой класс, который отображает песню в ListView:

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 (вы можете использовать максимальное использование памяти в кеше).

Или используйте библиотеку, которая сделает все это для вас, например, волейбол.

+0

Эта проблема не решена кешем растрового изображения @Gabe – Pedo

 Смежные вопросы

  • Нет связанных вопросов^_^