Не удается сопоставить BpMemoryHeap с кучей в Android при сканировании мультимедиа

Я хочу отсканировать все песни, присутствующие на SD-карте, и показать их в списке.

В настоящее время мой подход: -

  1. Создайте класс asyncTask
  2. В методе doInBackground сканируйте все медиафайлы
  3. В посте выполните получение ListView и setCursorAdapter для этого ListView

В моем адаптере Custom Cursor у меня есть 3 метода: - 4. BindView 5. newView 6. getView (где у меня есть onItemClickListener)

У меня есть две проблемы: - Когда у меня есть песни более 450, он не сканирует все песни и показывает все еще 450 элементов списка.

Прослушиватель OnClickListener выдает ошибку -> Не удается сопоставить BpMemoryHeap с кучей. 07–18 18:00:56.977: ОШИБКА/JavaBinder(1620): Неперехваченное удаленное исключение! (Исключения между процессами пока не поддерживаются.) *

Ниже приведена моя асинхронная задача:

закрытый класс FetchAllMusic extends AsyncTask { треки ArrayList; Курсор-курсор,cursorAlbums;

    @Override
    protected void onPreExecute() {
        myWaitDialog.run();
        super.onPreExecute();
    }

    @SuppressWarnings("unchecked")
    @Override
    protected Byte doInBackground(Void... params) {
            String[] projection = { MediaStore.Audio.Media._ID,
                MediaStore.Audio.Media.ARTIST,          MediaStore.Audio.Media.DATA,
                MediaStore.Audio.Media.DISPLAY_NAME,
                MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.ALBUM,
                MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.DURATION
                                 };
        String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
     cursor = PlaylistScreen.this.managedQuery(
                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection,
                selection, null, null);
        cursor.moveToFirst();

          cursorAlbums = null;
            if(cursor.moveToFirst()){
                do{
                 String[] projection1 = { MediaStore.Audio.Albums.ALBUM_ART };
                    String selection1 = MediaStore.Audio.Albums._ID + " =="
                            + cursor.getString(6);

                     cursorAlbums = PlaylistScreen.this.managedQuery(
                             MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, /* projection */
            projection1, selection1, null, null);

                }while(cursor.moveToNext());
            }

            return null;
    }

     protected void onPostExecute(Byte result) {

        myWaitDialog.dismiss();
        layoutAllMusic = (LinearLayout) findViewById(R.id.l_all_music);
        try{
        Comparator comparator = Collections.reverseOrder();
            System.out.println(tracks);
                //Collections.sort(tracks, comparator);
                }catch(Exception e){

            e.printStackTrace();
        }
    Log.d("Before List Adapter","+++++++++++++++++");
      PlaylistScreen.this.lv = getListView();


    MusicCursorAdapter musicCursor = new MusicCursorAdapter(PlaylistScreen.this, cursor, cursorAlbums);
       PlaylistScreen.this.lv.setAdapter(musicCursor);
      super.onPostExecute(result);
    }
}

person abhishek    schedule 18.07.2011    source источник
comment
Редко мне удается даже сканировать медиафайлы. Большую часть времени я получаю сообщение об ошибке: Слишком много открытых файлов, невозможно сопоставить BpMemoryHeap с кучей.   -  person abhishek    schedule 18.07.2011


Ответы (1)


Убедитесь, что вы закрыли все используемые вами курсоры....

cursor = PlaylistScreen.this.managedQuery(
            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection,
            selection, null, null);
    cursor.moveToFirst();

      cursorAlbums = null;
        if(cursor.moveToFirst()){
            do{
             String[] projection1 = { MediaStore.Audio.Albums.ALBUM_ART };
                String selection1 = MediaStore.Audio.Albums._ID + " =="
                        + cursor.getString(6);

                 cursorAlbums = PlaylistScreen.this.managedQuery(
                         MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, /* projection */
        projection1, selection1, null, null);

            }while(cursor.moveToNext());
        }
        cursor.close();
        return null;

И снова попробуйте закрыть два других курсора (musicCursor, cursorAlbums). Надеюсь, он должен работать нормально.

person ShivRaj    schedule 02.08.2011