1

나는 모든 오디오 및 비디오 파일 (SD 카드에 있음)을 안드로이드 ListView에 나열한 작은 프로그램을 작성했습니다. AsyncTask 안에 CursorLoader을 사용하여 MediaStore을 쿼리 한 다음 결과 데이터로 내 ListView을 채 웁니다. 프로그램이 잘 작동하고 있습니다.ListView의 오디오 및 비디오 파일 나열

내 문제는 내가 앱을 실행할 때마다 미디어 목록을 만드는 데 꽤 오랜 시간이 걸린다는 것입니다. 이해합니다. 집중적 인 데이터베이스 쿼리 때문입니다. 그러나 모든 미디어 파일을 처음으로 스캔하는 일부 애플리케이션 (스톡 미디어 플레이어, MX 플레이어 등)을 보았습니다 (어느 정도 소요될 수 있습니다). 그 후 앱이 다시 시작되면 미디어 목록이 거의 즉시 팝업됩니다. 어떻게하면 될까요? 내 AsyncTaskdoInBackground 내에서이 메서드를 호출하고있어

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

:

@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에서는 한번도 시도한 적이 없다는 것을 알고있다.

관련 문제