В чем разница между методами Android invalidate () и postInvalidate ()? - PullRequest
22 голосов
/ 29 сентября 2011

В чем разница между методами Android invalidate() и postInvalidate()? Когда каждый будет вызван? Методы должны вызываться только в классах, которые расширяют View?

1 Ответ

37 голосов
/ 29 сентября 2011

Если вы хотите перерисовать ваше представление из UI Thread, вы можете вызвать invalidate() метод.

Если вы хотите перерисовать вид из Non UI Thread, вы можете вызвать postInvalidate() метод.

Каждый класс, производный от класса View, имеет метод invalidate и postInvalidate. Если вызывается invalidate, он сообщает системе, что текущее представление изменилось, и его следует перерисовать как можно скорее. Поскольку этот метод может быть вызван только из вашего UIThread, необходим другой метод, когда вы не в UIThread и все еще хотите уведомить систему об изменении вашего View. Метод postInvalidate уведомляет систему о не-UIThread, и представление как можно скорее перерисовывается в следующем цикле событий в UIThread. Это также кратко объяснено в документации SDK:

НАЖМИТЕ ЗДЕСЬ

UPDATE:

Существуют некоторые проблемы, возникающие при использовании postInvalidate из других потоков (например, отсутствие немедленного обновления пользовательского интерфейса), это будет более эффективным:

runOnUiThread(new Runnable() {
    public void run() {
    myImageView.setImageBitmap(image);
    imageView.invalidate();
    }
});
...