ProgressBar не обновляется правильно после возврата в Activity - PullRequest
1 голос
/ 30 сентября 2011

MyBookshelf расширяет Activity и реализует интерфейс, вызываемый асинхронными процессами загрузки и распаковки.

Асинхронный процесс загрузки периодически вызывает onBookDownloadPercent(float) из интерфейса. Определение моей активности включает в себя:

public class MyBookshelf extends Activity implements BookDownloadListener {

    private ProgressBar mProgress;

    // .......
    // .......

    @Override
    public void onBookDownloadPercent(float _percent_finished) {
        final float final_percent  = _percent_finished;
        runOnUiThread(new Runnable() {
            public void run()
            {
                DebugLog.d(TAG, "onBookDownloadPercent " + Float.toString(final_percent));
                mProgress.setProgress((int) final_percent);
            }
        });
    }
}

В LogCat моя функция DebugLog.d уверяет меня, что поток пользовательского интерфейса вызывает mProgress.setProgress():

09-30 11:37:06.698: DEBUG/MyBookshelf(2069): onBookDownloadPercent 0.0014221431; thread 1
09-30 11:37:07.288: DEBUG/MyBookshelf(2069): onBookDownloadPercent 1.0004596; thread 1
09-30 11:37:07.838: DEBUG/MyBookshelf(2069): onBookDownloadPercent 2.0001705; thread 1
09-30 11:37:08.318: DEBUG/MyBookshelf(2069): onBookDownloadPercent 3.0014038; thread 1
09-30 11:37:09.098: DEBUG/MyBookshelf(2069): onBookDownloadPercent 4.0002813; thread 1
09-30 11:37:09.468: DEBUG/MyBookshelf(2069): onBookDownloadPercent 5.0003366; thread 1
09-30 11:37:09.818: DEBUG/MyBookshelf(2069): onBookDownloadPercent 6.0003924; thread 1
09-30 11:37:10.158: DEBUG/MyBookshelf(2069): onBookDownloadPercent 7.0004926; thread 1
09-30 11:37:10.588: DEBUG/MyBookshelf(2069): onBookDownloadPercent 8.000748; thread 1
09-30 11:37:10.938: DEBUG/MyBookshelf(2069): onBookDownloadPercent 9.000215; thread 1
09-30 11:37:11.368: DEBUG/MyBookshelf(2069): onBookDownloadPercent 10.00017; thread 1

У меня есть аналогичный интерфейс для асинхронной распаковки:

@Override
public void onBookUnzipPercent(float _percent_finished) {
    final float final_percent  = _percent_finished;
    runOnUiThread(new Runnable() {
        public void run()
        {
            DebugLog.d(TAG, "onBookUnzipPercent " + Float.toString(final_percent));
            mProgress.setProgress((int) final_percent);
        }
    });
}

Сначала MyBookshelf вызывает асинхронную задачу, которая загружает первую книгу, и индикатор выполнения корректно обновляется (от 0 до 100%).

Во-вторых, MyBookshelf вызывает асинхронную задачу, которая распаковывает первую книгу, и индикатор выполнения корректно обновляется (от 0 до 100%).

В-третьих, MyBookshelf звонит startActivity(nextIntent), чтобы прочитать книгу, и звонит finish() на себя.

В-четвертых, я возвращаюсь на Книжную полку после прочтения книги:

nextIntent = new Intent(getBaseContext(), MyBookshelf.class);

Проблема возникает при загрузке следующей книги: загрузка происходит, и LogCat регистрирует обновления, но индикатор выполнения виден только как пустой серый и не обновляется при загрузке или при разархивировании следующей книга. Я подтвердил с LogCat, что поток 1 действительно работает через onBookDownloadPerecent Runnable

Нужно ли делать что-то интересное с mProgress при возврате к MyBookshelf, чтобы оно отображалось при обновлении?

Ответы [ 2 ]

1 голос
/ 01 октября 2011

Мое решение состояло в том, чтобы сделать mProgressBar статическим:

public class MyBookshelf extends Activity implements BookDownloadListener {

    static private ProgressBar mProgress;

    // .......
    // .......

    @Override
    public void onBookDownloadPercent(float _percent_finished) {
        final float final_percent  = _percent_finished;
        runOnUiThread(new Runnable() {
            public void run()
            {
                DebugLog.d(TAG, "onBookDownloadPercent " + Float.toString(final_percent));
                mProgress.setProgress((int) final_percent);
            }
        });
    }
}
0 голосов
/ 30 сентября 2011

Почему вы не используете Finish () при возврате к myBookShelf после прочтения книги?

Кажется, все в порядке, но у меня есть небольшие сомнения по поводу этой строки кода

nextIntent = new Intent(getBaseContext(), MyBookshelf.class);

...