У меня здесь есть кнопка, которая вызывает очень длительный расчет. Чтобы указать это пользователю, я хочу отобразить символ загрузки. Расчет вызывается в этом методе в дополнительном потоке (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 ??