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:
<?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:
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); } }; }