Почему этот код занимает много времени?

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

https://stackoverflow.com/a/12227047/2714061

Ну почему этот код так долго возвращает этот список песен. Я включил этот код в функцию, которая вызывается из метода oncreate в плейлисте моего плеера.
Вот что происходит.
1: Когда приложение запускается в первый раз на моем Android-телефоне, плейлист нечего показать, и, следовательно, он отображается пустым.
2: Ну, например, через 30 секунд, когда я снова вызываю плейлист, он мгновенно возвращает все песни.

Следовательно, создается впечатление, что для выполнения этого действия требуется время?
Почему это происходит?


person user2714061    schedule 01.09.2013    source источник
comment
запустите его в фоновом режиме, а затем загрузите, может быть, их слишком много   -  person Trikaldarshiii    schedule 01.09.2013
comment
Что ж, @Photon, я тоже пробовал то же самое, используя поток, но вместо этого это создает ненужные сложности без каких-либо результатов.   -  person user2714061    schedule 01.09.2013


Ответы (1)


Как насчет использования асинхронной задачи, чтения файла или загрузки чего-либо, требуется время, которое требует от пользователя ожидания, вы должны подумать об использовании асинхронной задачи для этой цели,

1: Из имеющегося у нас справочника разработчиков: AsyncTask обеспечивает правильное и простое использование потока пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и/или обработчиками. http://developer.android.com/reference/android/os/AsyncTask.html

Асинхронная задача определяется тремя универсальными типами, называемыми Params, Progress и Result, и четырьмя этапами, называемыми onPreExecute, doInBackground, onProgressUpdate и onPostExecute.

2: Таким образом, вы можете включить класс задачи Async как:

 class DoBackgroundTask extends AsyncTask<URL, Void, ArrayList> {
           /*
             URL is the file directory or URL to be fetched, remember we can pass an array of URLs, 
            Void is simple void for the progress parameter, you may change it to Integer or Double if you also want to do something on progress,
            Arraylist is the type of object returned by doInBackground() method.

           */
    @Override
    protected ArrayList doInBackground(URL... url) {
     //Do your background work here
     //i.e. fetch your file list here

              return fileList; // return your fileList as an ArrayList

    }

    protected void onPostExecute(ArrayList result) {

    //Do updates on GUI here
     //i.e. fetch your file list from result and show on GUI

    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        // Do something on progress update
    }

}
//Meanwhile, you may show a progressbar while the files load, or are fetched.

Эту AsyncTask можно вызвать из вашего метода onCreate, вызвав его метод execute и передав ему аргументы:

 new DoBackgroundTask().execute(URL);

3: И, наконец, есть очень хороший учебник по AsyncTasks здесь, http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html

person Rachit Mishra    schedule 01.09.2013
comment
Спасибо @twntee, я обязательно включу это!! - person user2714061; 01.09.2013