Jaka jest różnica między metodami Android invalidate()
i postInvalidate()
? Kiedy każdy zostaje wezwany? Czy metody należy wywoływać tylko w klasach, które rozciągają się na View
?Jaka jest różnica między metodami invalid() i postInvalidate() systemu Android?
Odpowiedz
Jeśli chcesz ponownie narysować swój widok z UI Thread
, możesz zadzwonić pod numer invalidate()
.
Jeśli chcesz ponownie narysować swój widok z Non UI Thread
, możesz zadzwonić pod numer postInvalidate()
.
Każda klasa, która wywodzi się z klasy View, ma metodę unieważnienia i postInvalidate. Jeśli zostanie wywołane unieważnienie, system poinformuje, że bieżący widok został zmieniony i powinien zostać ponownie przerysowany tak szybko, jak to możliwe. Ponieważ ta metoda może być wywołana tylko z twojego UIThread, potrzebna jest inna metoda, gdy nie jesteś w UIThread i wciąż chcesz powiadomić system, że Twój Widok został zmieniony. Metoda postInvalidate powiadamia system z obiektu innego niż UIThread, a widok jest przerysowywany w następnym zbiorze zdarzeń na UIThread tak szybko, jak to możliwe. Jest również krótko opisane w dokumentacji SDK:
UPDATE:
Są pewne problemy, które pojawiają się podczas korzystania postInvalidate z innych wątków (jak nie mając UI aktualizowane prawą daleko), to będzie bardziej wydajny:
runOnUiThread(new Runnable() {
public void run() {
myImageView.setImageBitmap(image);
imageView.invalidate();
}
});
nie będzie dokładnie to, co robi postInvalidate()? – rupps
W przykładowym kodzie androida: http://developer.android.com/training/custom-views/index.html znajduje się plik PieChart.java, który zawiera wewnątrz siebie selektory i selektory właściwości. Większość zestawów właściwości wywołuje funkcję invalidate() ;. Czy PieChart.java nie jest wątkiem interfejsu użytkownika i dlaczego może wywoływać tam unieważnienie? (istnieje główny plik java działania, który jest głównym wątkiem). Spodziewałbym się wywołania funkcji postinvalidate(); tak jak zrobili to w metodzie onDraw w PieChart.java. – Simon
@Simon Nie patrzyłem na kod, ale PieChart.java nadal pracuje nad wątkiem interfejsu użytkownika, chyba że rozszerzy wątek lub określi inny wątek do użycia w inny sposób. Prawdopodobnie dzieje się tak, że wykres kołowy jest narysowany, a następnie 'postInvalidate()' jest wywoływane w 'onDraw' wykresu kołowego, aby narysować wykres kołowy w widoku w wątku UI. –