Видимость индикатора выполнения не устанавливается до выполнения кода - PullRequest
2 голосов
/ 31 декабря 2011

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

Проблема в том, что, кажется, выполняется код перед установкой видимости индикатора выполнения.

    public void makeAvailable() {
    mProgressBar.setVisibility(View.VISIBLE);
        File dir = new File(gMusic);
        String[] songNames = dir.list();
        File[] songs = dir.listFiles();
        for (int i=0; i<songs.length; i++) {
            File song = songs[i];
            String songName = songNames[i];
            String[] bits = songName.split("/");
            String songStripped = bits[bits.length-1];
            File output = new File(Constants.gMusicSniperDir + "music/" + songStripped);
            try {
                copyFile(song, output);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        mProgressBar.setVisibility(View.INVISIBLE);
}

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

1 Ответ

4 голосов
/ 31 декабря 2011

Похоже, вы делаете всю свою работу в потоке пользовательского интерфейса. Вы должны выполнить всю тяжелую работу (перечислить содержимое каталога и скопировать файлы) в фоновом потоке, отправляя запросы в поток пользовательского интерфейса только для обновления индикатора выполнения.

В документации ProgressBar приведен пример этого.

Обратите внимание, что это всего лишь один пример общей темы: вы не должны блокировать поток пользовательского интерфейса в течение какого-либо значительного промежутка времени, иначе ваше приложение перестанет отвечать на запросы. Подробнее см. «Проектирование для отзывчивости» .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...