Custom ListView Performance Problem mit MediaMetadataRetriever

  • Antworten:0
Gelöschter Account
  • Forum-Beiträge: 336

25.07.2014, 16:44:31 via Website

Hi Leute,

ich weiß mir nicht mehr weiterzuhelfen :(. Ich will eine App erstellen, welche unteranderem die Covers und weitere Informationen wie Interpreten und Albums aus .mp3 Dateien ausließt und dann in einer Custom ListView anzeigt. Das ganze klappt auch erfolgreich, jedoch mit unglaublichen Scrollingschwierigkeiten (auch mit Threads). Diese werden durch das auslesen und setzen des Covers verursacht. Also habe ich im Internet recherchiert und kam auf die Android Developer Seite und deren Performance Tipps für ListViews. Diese sagten man könne die Performance steigern, in dem man ViewHolder und Asynctasks benutzt. Dies habe ich ich auch umgesetzt, jedoch ohne Erfolg. Für das auslesen des MusicCovers benutze ich die getEmbeddedPicture() Methode der Klasse MediaMetadataRetriever. Hier der Code:

FileListActivity.class:

File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
    File[] musicFiles = dir.listFiles();
    Log.d("One File", musicFiles[0].getAbsolutePath());
    FileMenuAdapter fileMenuAdapter = new FileMenuAdapter(FileListActivity.this, R.layout.file_list_row_item, musicFiles);
    ListView listView = (ListView) findViewById(R.id.listView);
    listView.setAdapter(fileMenuAdapter);

FileMenuAdapter.class:

public class FileMenuAdapter extends ArrayAdapter<File> {
Context context;
int layoutResourceId;
LayoutInflater inflater;
File[] musicFiles;

public FileMenuAdapter(Context context, int layoutResourceId, File[] musicFiles) {
    super(context, layoutResourceId, musicFiles);
    this.context = context;
    this.layoutResourceId = layoutResourceId;
    this.musicFiles = musicFiles;
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    View rowView = convertView;
    if (rowView == null) {
        rowView = inflater.inflate(R.layout.file_list_row_item, null);
        viewHolder = new ViewHolder();
        viewHolder.imageView = (ImageView) rowView.findViewById(R.id.coverImage);
        viewHolder.textView1 = (TextView) rowView.findViewById(R.id.songName);
        viewHolder.textView2 = (TextView) rowView.findViewById(R.id.albumName);
        viewHolder.textView3 = (TextView) rowView.findViewById(R.id.songLength);
        viewHolder.textView4 = (TextView) rowView.findViewById(R.id.artist);
        rowView.setTag(viewHolder);
    }

    viewHolder = (ViewHolder) rowView.getTag();
    viewHolder.musicFile = musicFiles[position];
    new Operation().execute(viewHolder);
    return rowView;

}

static class ViewHolder {
    ImageView imageView;
    TextView textView1;
    TextView textView2;
    TextView textView3;
    TextView textView4;
    Bitmap bitmap;
    File musicFile;
}

public class Operation extends AsyncTask<ViewHolder, Void, ViewHolder> {

    @Override
    protected ViewHolder doInBackground(ViewHolder... params) {
        ViewHolder viewHolder = params[0];
        MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever();
        metadataRetriever.setDataSource(viewHolder.musicFile.getAbsolutePath());
        if (metadataRetriever.getEmbeddedPicture() == null) {
            viewHolder.bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.defaultcover);
        } else {
            byte[] bytes = metadataRetriever.getEmbeddedPicture();
            viewHolder.bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
            metadataRetriever.release();
        }
        return viewHolder;
    }

    @Override
    protected void onPostExecute(ViewHolder viewholder) {
        viewholder.imageView.setImageBitmap(viewholder.bitmap);
        viewholder.textView1.setText("Test 1");
        viewholder.textView2.setText("Test 2");
        viewholder.textView3.setText("Test 3");
        viewholder.textView4.setText("Test 4");
    }
}

}

Danke schon mal im Voraus :)

Android Developer

Antworten