2011-09-29 11 views

Odpowiedz

33

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:

CLICK HERE

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(); 
    } 
}); 
+3

nie będzie dokładnie to, co robi postInvalidate()? – rupps

+0

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

+0

@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. –