В чем разница между методами Android invalidate()
и postInvalidate()
? Когда вызываются вызовы? Должны ли методы быть вызваны только в классах, которые расширяют View
?
В чем разница между методами Android invalidate() и postInvalidate()?
Ответ 1
Если вы хотите перерисовать ваше представление из потока пользовательского интерфейса, вы можете вызвать метод invalidate()
.
Если вы хотите перерисовать ваше представление из потока, не являющегося пользовательским интерфейсом, вы можете вызвать метод postInvalidate()
.
Каждый класс, производный от класса View
, имеет недействительный метод и метод postInvalidate
. Если вызывается invalidate, он сообщает системе, что текущее представление изменилось, и его следует перерисовать как можно скорее. Поскольку этот метод может быть вызван только из вашего потока пользовательского интерфейса, необходим другой метод, если вы не находитесь в потоке пользовательского интерфейса и все еще хотите уведомить систему об изменении вашего представления. Метод postInvalidate
уведомляет систему из потока, не являющегося пользовательским интерфейсом, и представление перерисовывается в следующем цикле событий в потоке пользовательского интерфейса как можно скорее. Это также кратко объяснено в документации SDK:
UPDATE:
Существуют некоторые проблемы, возникающие при использовании postInvalidate из других потоков (например, отсутствие немедленного обновления пользовательского интерфейса), это будет более эффективным:
runOnUiThread(new Runnable() {
public void run() {
myImageView.setImageBitmap(image);
imageView.invalidate();
}
});