Animationen mit »postDelayed« mit Android
Das folgende Programmbeispiel zeigt wie ein Textfeld automatische jede Sekunde aktualisiert (hier: hochgezählt) werden kann.
Um eine Sekunde zu warten, sollte nicht »java.lang.Thread.sleep« verwendet werden, weil dies den gesamten Faden der Anwendung blockiert und dadurch zu Störungen führt.
Eine Animation ist aber möglich, indem eine Methode sich selber via »android.os.Handler#postDelayed« aufruft und so eine Schleife mit einer Pause von 1000 ms realisiert. In diesem Fall endet die Methode zunächst und der Thread kann andere Aufgaben erledigen. Nach 1000 ms wird das java.lang.Runnable-Objekt dann in eine Liste zu aktivierender Objekte eingetragen und so erneut gestartet. Da das Objekt dann erneut »android.os.Handler#postDelayed« aufruft, entsteht eine Endlosschleife.
Da es sich bei dieser Form des Selbstaufrufs nicht um eine speicherverzehrende Rekursion handelt, kann sie beliebig oft wiederholt werden.
MainActivity.java
package com.example; public final class MainActivity extends android.app.Activity
{ final android.app.Activity activity = this;
final android.content.Context context = this; @java.lang.Override protected final void onCreate
( final android.os.Bundle bundle )
{ super.onCreate( bundle ); final android.widget.TextView textView
= new android.widget.TextView( MainActivity.this.context );
final java.lang.StringBuilder builder
= new java.lang.StringBuilder( 64 );
MainActivity.this.activity.setContentView( textView );
new java.lang.Runnable()
{ long i = 0;
final android.os.Handler handler = new android.os.Handler();
final java.lang.Runnable runnable = this;
@java.lang.Override public void run()
{ builder.setLength( 0 );
builder.append( i++ );
final java.lang.String string = builder.toString();
activity.setTitle( string );
textView.setText( string );
android.util.Log.i( string );
handler.postDelayed( this.runnable, 1000 ); }}.run(); }}
Zur Vereinfachung wurde in dem obigen Programm darauf verzichtet, die Endlosschleife beim Beenden der Aktivität zu beenden. Daher ist dieses Programm noch nicht richtig auf den Neustart der Aktivität bei weiterlaufender Anwendung vorbereitet, wie er etwa bei Ändern der Bildschirmorientierung erfolgt.