Android - Threads: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
Zeile 51: Zeile 51:
  
 
=== Threads in Android Activities ===
 
=== Threads in Android Activities ===
 +
http://android-developers.blogspot.de/2009/05/painless-threading.html
  
 
In Android läuft jede Activity in einem eigenen Thread (Main Thread). D.h. wenn diese Beschäftigt ist z.B. für eine Berechnung, dann ist auch das User Interface blockiert.
 
In Android läuft jede Activity in einem eigenen Thread (Main Thread). D.h. wenn diese Beschäftigt ist z.B. für eine Berechnung, dann ist auch das User Interface blockiert.
  
Android erlaubt ganz '''normale Java Threads'''.
+
Android erlaubt ganz '''normale Java Threads''' und auf den ersten Blick funktioniert es auch.
  
 
<pre>
 
<pre>
Zeile 66: Zeile 67:
 
</pre>
 
</pre>
  
Möchte man von einem Thread aus (oder besser von einem Runnable aus) in das '''User Interface eingreifen''' (z.B. eine ProgressBar verändern) benötigt man einen '''Handler'''.
+
So sollte man es aber '''nicht machen'''.
  
Der Handler wird in der Acivity (z.B. in der onCreate() Methode) erzeugt und '''kann runnables entgegen nehmen''' (oder messages von einem scheduler) , die somit zugriff auf die Activity haben ohne den Main Thread zu blockieren.
+
'''Beispiel'''
 +
 
 +
Bild über das Netzwerk runterladen und als ImageView zeigen.
 +
 
 +
'''So nicht'''
 +
<pre>
 +
public void onClick(View v) {
 +
  new Thread(new Runnable() {
 +
    public void run() {
 +
      Bitmap b = loadImageFromNetwork();
 +
      mImageView.setImageBitmap(b);
 +
    }
 +
  }).start();
 +
}
 +
</pre>
 +
Um immer mit dem Hauptthread verbunden zu bleiben gibt es mehrerer Wege:
 +
* Activity.runOnUiThread(Runnable)
 +
* View.post(Runnable)
 +
* View.postDelayed(Runnable, long)
 +
* Handler
  
 
=== Handlers ===
 
=== Handlers ===

Version vom 9. März 2013, 11:43 Uhr

Nebenläufigkeit...

Links

Allgemein

Threads über das Interface Runnable

Der Thread

Damit ein Thread weiß was er tun soll braucht er Befehlsfolgen. Diese bekommt er mit einem Runnable Objekt.

Der Thread bekommt dazu eine Referenz auf ein Runnable Objekt. So weiß er für welches runnable er zuständig ist. Dann Ruft man die Methode start() auf. Der Thread holt sich dann das Runnable und started dort die Methode run() in einer eigenen Ablaufumgebung - dem Thread.

Das Runnable

Das Runnable enthält eine Methode run() die ausgeführt wird, wenn es durch den Eltern Thread gestartet wird.

Beispiel aus dem Galileo Link s.o.


public class DateCommand implements Runnable
{
  @Override public void run()
  {
    for ( int i = 0; i < 20; i++ )
      System.out.println( new java.util.Date() );
  }
}

class CounterCommand implements Runnable
{
  @Override public void run()
  {
    for ( int i = 0; i < 20; i++ )
      System.out.println( i );
  }
}

Thread t1 = new Thread( new DateCommand() );
t1.start();

Thread t2 = new Thread( new CounterCommand() );
t2.start();

Bei der Ausgabe erkennt man das die beiden Threads gleichzeitig laufen.

Läuft der Thread schon, so löst ein zweiter Aufruf der start()-Methode eine IllegalThreadStateException aus.

Threads in Android Activities

http://android-developers.blogspot.de/2009/05/painless-threading.html

In Android läuft jede Activity in einem eigenen Thread (Main Thread). D.h. wenn diese Beschäftigt ist z.B. für eine Berechnung, dann ist auch das User Interface blockiert.

Android erlaubt ganz normale Java Threads und auf den ersten Blick funktioniert es auch.

Thread thread = new Thread(new Runnable(){
		@Override
		public void run() {
			// mach was	
		}
}); 
thread.start();

So sollte man es aber nicht machen.

Beispiel

Bild über das Netzwerk runterladen und als ImageView zeigen.

So nicht

public void onClick(View v) {
  new Thread(new Runnable() {
    public void run() {
      Bitmap b = loadImageFromNetwork();
      mImageView.setImageBitmap(b);
    }
  }).start();
}

Um immer mit dem Hauptthread verbunden zu bleiben gibt es mehrerer Wege:

  • Activity.runOnUiThread(Runnable)
  • View.post(Runnable)
  • View.postDelayed(Runnable, long)
  • Handler

Handlers

Handler braucht man wenn:

  • Ein Thread mit dem UserInterface kommunizieren will.
  • Ein Thread MessageQueuing, scheduling and wiederholende Tasks ausführen soll.


AsyncTasks