Daten in einem Thread laden

Folgendes Tutorial zeigt, wie man Daten in einem Thread laden kann. Zusätzlich wird während dem Laden ein „Loading“-Dialog gezeigt.

Als erstes brauchen wir in ein Layout. Zum Beispiel ein normales Textfeld, welches wir im main.xml definieren:

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView android:id="@+id/text"
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
/>
</LinearLayout>

Unsere Klasse muss dann das Runnable Interface implementieren:

public class myThread extends Activity implements Runnable {

Damit wir den Dialog zum Laden anzeigen können brauchen wir auch eine Klassevariable dafür. Zusätzlich brauchen wir einen String und unsere TextView:

private ProgressDialog pd;
private TextView tv;
private String s;

Nun müssen wir in der onCreate-Methode unsere TextView zuweisen und den Dialog zum laden starten. Anschliessend starten wir auch unseren Thread:

tv = (TextView) this.findViewById(R.id.text);
pd = ProgressDialog.show(this, "Bitte waren...", "Daten werden geladen", true, false);
 
Thread thread = new Thread(this);
thread.start();

Im Thread machen wir nun was wir wollen (in meinem Beispiel nur einen Text zuweisen) und rufen einen Handler auf, welcher uns den Text der TextView zuweist und den Dialog wieder beendet. Wir brauchen den Handler, da der Thread nicht auf Layoutkomponenten zugreifen kann.

public void run() {
	s = "my String"; // Add your code here
	handler.sendEmptyMessage(0);
}
 
 
private Handler handler = new Handler() {
	@Override
	public void handleMessage(Message msg) {
		pd.dismiss();
		tv.setText(s);
	}
};

Das wars :-) Der komplette Code sieht wie folgt aus:

myThread.java
package ch.aquasonic.android.example;
 
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
 
public class myThread extends Activity implements Runnable {
 
	private ProgressDialog pd;
	private TextView tv;
	private String s;
 
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
 
		// Get our textview
		tv = (TextView) this.findViewById(R.id.text);
 
		// Show process dialog
		pd = ProgressDialog.show(this, "Bitte waren...", "Daten werden geladen", true, false);
 
		// Start the thread
		Thread thread = new Thread(this);
		thread.start();
	}
 
	public void run() {
		// Add your code here
		s = "my String";
 
		// Call the handler to set the text
		handler.sendEmptyMessage(0);
	}
 
 
	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			// Hide dialog
			pd.dismiss();
 
			// Set the text
			tv.setText(s);
		}
	};
}
android/daten_in_einem_thread_laden.txt · Zuletzt geändert: 27.12.2013 19:46 (Externe Bearbeitung)
Nach oben
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0