Feedback geben

In meinem Projekt, was kurz vor der Veröffentlichung steht, hatte ich das Problem das mein RequestHandler, der eine HTML Anfrage stellt und das zurückgegebene Objekt was zurückkommt parsed, zulange braucht.

Wir haben ja alle gelernt das der Benutzer ziemlich grantig wird wenn er nicht schnellst möglich ein Feedback bekommt. Darum wollte ich natürlich ein Fortschrittsbalken (Progress Bar) anzeigen um den Benutzer zu suggerieren es geht vor ran ;). Nun ja das hat sich doch als ziemlich schwierig herausgestellt denn ich wollte ja keine x beliebige Progress Bar sondern eine die im Titel meiner Applikation zu sehen ist.

Und wie ich das gelöst habe erkläre ich euch in diesem Artikel.

Da wollen wir hin

Da wollen wir hin

Zu dem Zweck habe ich mir eine neue Activity (LoadActivity) erstellt die nicht viel macht sondern nur:

  • einen TextView anzeigen mit einem Text das die Daten geladen werden (XMLLayout)
  • über die Progress Bar wachen und diese auch anzeigen

Um die Progress Bar in dem Titel an zu zeigen braucht man folgenden Code:

public class LoadActivity extends Activity{
		HeavyThread heavyThread;

	@Override
	protected void onCreate(Bundle savedInstanceState) {

		heayThread = new HeavyThread(this);

		requestWindowFeature(Window.FEATURE_PROGRESS);

		setContentView(R.layout.loadscreen);

       	setProgressBarVisibility(true);

		super.onCreate(savedInstanceState);
	}
}

Der HeavyThread ist der Thread der zu lange dauert und der ein FeedBack zurückgeben soll.

public class HeavyThread implements Runnable{

	private int progress = Window.PROGRESS_START;
	private Activity activity;

	public HeavyThread(Activity activity){
		this.activity = activity;
	}

	public void run(){

		long start = System.currentTimeMillis();
		long actualTimeStep;

		while(start + 10000 < (actualTimeStep = System.currentTimeMillis())){
			if(System.currentTimeMillis() > actual + 100){
				(LoadActivity)activity.toggleProgress(progress + 100);
			}
		}
	}
}

Das ist der HeavyThread. Es ist eine Beispiel Implementation:

  • sie soll eine Lade Zeit von 10 Sekunden simulieren
  • alle 100 ms Sekunden bewegt sich der Fortschrittsbalken vorwärts
  • er muss die Activity kennen um den Fortschritt setzen zu können

Jetzt müssen wir nur noch den Thread starten und über den Fortschritt wachen. Das machen wir mit 2 weiteren Methoden in der LoadActivity.

	@Override
	public void onStart(){

		runOnUiThread(heavyThread);

		super.onStart();
	}

	public void toggleProgress(int progress){
		if(progress < Window.PROGRESS_END){
			setProgress(progress);
		}else{
			TextView loaded = (TextView)findViewById(R.id.load);
			loaded.setText("Data loaded");
		}
	}
&#91;/sourcecode&#93;

In der onStart() Methode müssen wir die Activity Methode <a href="http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)">runOnUiThread(Runnable runnable)</a> benutzen. Wenn wir das nicht machen würden, gäbe es eine Exception das unser Thread den Fortschritt nicht setzen darf weil er nicht der UI Thread ist.

Die toggleProgress() Methode passt im Endeffekt nur auf ob wir fertig sind mit laden wenn nicht dann setzt sie den Fortschritt auf den angegebenen Wert.

Die XML Layout Datei sieht so aus:
<A NAME="XMLLayout"></A>

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_height="fill_parent"
	android:layout_width="fill_parent">

<TextView android:id="@+id/load"
	android:layout_height="fill_parent"
	android:layout_width="fill_parent"
	android:text="Loading data"/>

</RelativeLayout>

Das war auch schon alles. Wenn ihr die Applikation startet müsste es so ähnlich aussehen wie auf dem Screenshot nur mit der Einschränkung das eure Applikation anders heißen wird und der Text in dem TextView wird wahrscheinlich auch ein anderer sein.

Schlagwörter: , , , , , , , , , , , , ,

Hinterlasse einen Kommentar