Hintergrundprozess funktioniert nicht

J

JoEntwickler

Ambitioniertes Mitglied
Threadstarter
Hallo,

ich möchte für die Erstellung einer PDF einen Hintergrundprozess machen.
Der wird aber beim Testen trotzdem im Vordergrund ausgeführt.

Handler handler = new Handler();
handler.post(new Runnable() {
@override
public void run() {
//Code
}
});

Wie genau funktioniert das in Android?

Liebe Grüße
 
1

123thomas

Fortgeschrittenes Mitglied
Hallo,

du musst das ganze in einem Thread auslagern. Für keinere Arbeiten kannst du auch den AsyncTask benutzen.
In deinem Fall würde ich den Asynctask nutzen.
 
D

deek

Stammgast
Der Handler in Android ist immer ein Handler für den aktuellen Thread, wenn du keinen explizit angibst.
d.h. du bist hier im MainThread.
Wenn du einen Handler für einen weiteren Thread haben willst, musst du erst einen HandlerThread erstellen und den dem Handler mitgeben. (irgendwas mit dem Looper ist da noch)
 
J

JoEntwickler

Ambitioniertes Mitglied
Threadstarter
Ich habs jetzt mal mit einem ganz normalen Thread wie man das in Java so macht versucht.
Aber der die App friert dann wärend der Bearbeitung ein. Gibts was das ich da noch vergessen habe?

Thread thread = new Thread(new Runnable() {
@override
public void run() {
//Code
}
});
thread.run();
 
J

JoEntwickler

Ambitioniertes Mitglied
Threadstarter
Oh ja stimmt. Sorry habs übersehen.

Jetzt hab ich aber noch das Problem das er bei einem Toast der nach meiner Bearbeitung, also auch in dem Thread angezeigt werden soll. Da wirft er immer eine Exception.

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:200)
at android.os.Handler.<init>(Handler.java:114)
at android.widget.Toast$TN$2.<init>(Toast.java:336)
at android.widget.Toast$TN.<init>(Toast.java:336)
at android.widget.Toast.<init>(Toast.java:103)
at android.widget.Toast.makeText(Toast.java:256)
at android.widget.Toast.makeText(Toast.java:283)
 
1

123thomas

Fortgeschrittenes Mitglied
Hallo,

das kommt daher, dass du von einem anderen Thread als dem Main Thread auf die GUI zugreifst. Daher musst du dann mit dem Looper arbeiten.

Ich meine das es einfacher ist mit einem Async Task und der GUI zu kommunizieren, aber das kann dir besser jemand anderes beantworten.

Gruß
 
J

JoEntwickler

Ambitioniertes Mitglied
Threadstarter
Ok hab auf die Schnelle mal gegoogelt und was gebastelt.
Aber es passiert nichts.

Thread thread = new Thread(new Runnable() {
public Handler mHandler;

@override
public void run() {
Looper.prepare();

mHandler = new Handler() {
@override
public void handleMessage(Message msg) {
//Code
}
};

Looper.loop();
}
});
thread.start();
 
J

jogimuc

Erfahrenes Mitglied
Hallo
mache es so.

Thread thread = new Thread(new Runnable() {
@override
public void run() {
//Code


// Ausführen im UI mit runOnUiThread
runOnUiThread(new Runnable(){
public void run() {
// Hier der Code der im UI ausgeführt werden soll
}
});


// Ausführen im UI mit Handler
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
public void run() {
// Hier der Code der im UI ausgeführt werden soll
}
});


}
});

// Wichtig den Thread mit start() Starten, nicht mit run()
thread.start();
 
J

JoEntwickler

Ambitioniertes Mitglied
Threadstarter
Perfekt funktioniert wie ich es mir vorgestellt hab.

Vielen Dank für die Tipps und euch ein schönes Wochenende.
 
Oben Unten