Подтвердить что ты не робот

В чем разница между методами Android invalidate() и postInvalidate()?

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

4b9b3361

Ответ 1

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

Если вы хотите перерисовать ваше представление из потока, не являющегося пользовательским интерфейсом, вы можете вызвать метод postInvalidate().

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

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

UPDATE:

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

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