Android-анимация / поведение графического интерфейса - PullRequest
0 голосов
/ 06 мая 2010

У меня здесь есть кнопка, которая вызывает очень длительный расчет. Чтобы указать это пользователю, я хочу отобразить символ загрузки. Расчет вызывается в этом методе в дополнительном потоке (LoadingAnimationThread);

@Override
        public void onClick(View v) {

            BookView bookView = (BookView) lexs.startBook();
            LoadingAnimationThread thread = null;
            if (type == BOOK) {
            thread = new LoadingAnimationThread(BOOK, book, bookView);
            } else if (type == CHAPTER) {
                thread = new LoadingAnimationThread(CHAPTER, chapter, bookView);
            } else if (type == PARAGRAPH) {
                thread = new LoadingAnimationThread(PARAGRAPH, paragraph, bookView);
            }

            LoadingAnimation.startAnimation();
            thread.run();
        }

Метод выполнения потока следующий:

@Override
        public void run() {

            if (type == BOOK) {
                ((BookView) bookView).setBookToDisplay(book);
            } else if (type == CHAPTER) {
                ((BookView) bookView).setBookToDisplay(chapter.getBook());
                ((BookView) bookView).setExpanededChapter(chapter, true);
            } else if (type == PARAGRAPH) {
                ((BookView) bookView).setBookToDisplay(paragraph.getParentChapter().getBook());
                ((BookView) bookView).setExpanededChapter(paragraph.getParentChapter(), false);
                ((BookView) bookView).setExpandedParagraph(paragraph);
            }
            LoadingAnimation.stopAnimation();
        }

Эти вызовы в методе выполнения Thread являются методами, которые требуют большого количества вычислений. С помощью функций LoadAnimation.startAnimation () и LoadingAnimation.stopAnimation () можно запускать и останавливать анимацию соответственно:

public static void startAnimation() {

        lexs.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                loadingImage.setImageResource(R.drawable.loading_background);
                animation.start();
                Log.v("Animation", "Loading Animation started");
            }
        });

    }

    public static void stopAnimation() {

        lexs.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                loadingImage.setImageResource(R.drawable.loading0);
                animation.stop();
                Log.v("Animation", "Loading Animation stopped");
            }
        });

    }

Я вижу строки журнала в Logcat, но анимация не отображается в графическом интерфейсе. Почему бы и нет??? Я знаю, что анимация работает правильно, потому что в других местах она работает правильно. Иногда Android не обновляет пользовательский интерфейс сразу, поэтому я использовал runOnUIThread (). Но документ для этого метода говорит:

Если текущий поток является пользовательским интерфейсом поток, то действие выполняется немедленно.

Так что я думаю, что текущий поток не является потоком пользовательского интерфейса, но как я могу найти поток пользовательского интерфейса? Или как я могу принудительно запустить Runnable ??

1 Ответ

1 голос
/ 07 мая 2010

Вы должны только вызывать runOnUiThread из фонового потока. Я думаю, что у вас есть логика в обратном направлении. Вы должны настроить его так, чтобы startAnimation и stopAnimation не делали никаких вызовов runOnUiThread, просто используйте код как есть. Затем startAnimation должен вызываться из основного потока пользовательского интерфейса, а stopAnimation может вызываться фоновым потоком с помощью runOnUiThread.

Вот пример кода:

    public void onClick(View v) {
    // this is the main thread
    // ......
    LoadingAnimation.startAnimation(); // Don't need to call this with runOnUiThread since we're on teh main thread
    thread.run();
}

@Override
public void run() {

    runOnUiThread(new Runnable() {
        // Need to put this in runOnUiThread since it's changing the UI from the background
        if (type == BOOK) {
            ((BookView) bookView).setBookToDisplay(book);
        } else if (type == CHAPTER) {
            ((BookView) bookView).setBookToDisplay(chapter.getBook());
            ((BookView) bookView).setExpanededChapter(chapter, true);
        } else if (type == PARAGRAPH) {
            ((BookView) bookView).setBookToDisplay(paragraph.getParentChapter().getBook());
            ((BookView) bookView).setExpanededChapter(paragraph.getParentChapter(), false);
            ((BookView) bookView).setExpandedParagraph(paragraph);
        }
        LoadingAnimation.stopAnimation();
    });
}

public static void startAnimation() {
    loadingImage.setImageResource(R.drawable.loading_background);
    animation.start();
    Log.v("Animation", "Loading Animation started");
}

public static void stopAnimation() {
    loadingImage.setImageResource(R.drawable.loading0);
    animation.stop();
    Log.v("Animation", "Loading Animation stopped");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...