1

Я написал небольшую программу, в которой перечислены все аудио и видео файлы (присутствующие на SD-карте) в андроиде ListView. Я использую CursorLoader внутри AsyncTask, чтобы запросить MediaStore, а затем заполнил мои ListView данными о результатах. Программа работает нормально.Список аудио- и видеофайлов в ListView

Моя проблема в том, что каждый раз, когда я запускаю приложение, для создания списка носителей требуется довольно много времени. Я понимаю, это из-за интенсивного запроса к базе данных. Тем не менее, я видел некоторые приложения (например, медиаплеер, проигрыватель MX и т. Д.), Которые сканируют все медиафайлы только в первый раз (что может занять некоторое время). После этого, когда приложение запускается снова, список носителей появляется почти мгновенно. Как я могу это достичь? Вот мой подход:

private void loadAudio() { 

    Uri uri1 = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    String selection1 = MediaStore.Audio.Media.IS_MUSIC + "!= 0"; 
    String sortOrder1 = MediaStore.Audio.Media.TITLE + " ASC"; 
    ContentResolver cr1 = getBaseContext().getContentResolver(); 
    Cursor cur1 = cr1.query(uri1, null, selection1, null, sortOrder1); 
    int count1 = 0; 

    if (cur1 != null) { 
     count1 = cur1.getCount(); 

     if (count1 > 0) { 
      while (cur1.moveToNext()) { 
       String audioPath = cur1.getString(cur1 
         .getColumnIndex(MediaStore.Audio.Media.DATA)); 
       //File tempfile = new File(audioPath); 
       long albumId = cur1.getLong(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID)); 
       String artist = cur1.getString(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)); 
       String album = cur1.getString(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM)); 
       String track = cur1.getString(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)); 
       String data = cur1.getString(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); 
       int duration = cur1.getInt(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)); 
       final Uri ART_CONTENT_URI = Uri.parse("content://media/external/audio/albumart"); 
       Uri albumArtUri = ContentUris.withAppendedId(ART_CONTENT_URI, albumId); 

       Bitmap albumartbitmap = null; 
       try { 
        albumartbitmap = MediaStore.Images.Media.getBitmap(getBaseContext().getContentResolver(), albumArtUri); 
       } catch (Exception exception) { 
        // log error 
       } 
       audioList.add(new AudioData(albumId, artist, album, track, data, duration, albumartbitmap, audioPath)); 
      } 
     } 
    } 
    cur1.close(); 
} 

Я звоню этот метод внутри doInBackground из моих AsyncTask:

@Override 
    protected Void doInBackground(Void... params) { 
     Looper.prepare(); 
     loadVideo(); //Query media-store and build video list. populate mediaList 
     loadAudio(); //Query media-store and build audio list. populate audioList 
     return null; 
    } 

Любая помощь будет оценен по достоинству! Заранее спасибо!

ответ

1

Единственное, что я могу думать о том, что может дать вам более быстрое время доступа, это построить внутреннюю базу данных SQL с вашими результатами. Когда ваше приложение откроется, вам нужно будет увидеть, присутствует ли база данных или нет. Если нет, вам нужно будет выполнить поиск на SD-карте, если у вас есть данные, у вас есть все данные, загруженные в базу данных, пригодную для поиска по SQL. Я бы по-прежнему ожидал, что у вас возникнут проблемы с загрузкой большого количества или результаты в базе данных sql.

Если в программах, на которые вы ссылаетесь, есть какие-либо опции «обновить/перестроить», тогда я буду думать, что они управляют им.

Единственный другой вариант, о котором я могу думать, это то, что они каким-то образом сохраняют весь объект listview во внутреннем файле, а затем просто загружают файл. Я знаю, что сохранение целого класса в файл возможно на C++, но он никогда не пробовал его в Java/Android