Hintergrundprozess funktioniert nicht

J

JoEntwickler

Fortgeschrittenes Mitglied
5
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
 
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.
 
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)
 
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();
 
thread.start() statt thread.run()
 
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)
 
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ß
 
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();
 
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();
 
  • Danke
Reaktionen: markus.tullius
Perfekt funktioniert wie ich es mir vorgestellt hab.

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

Ähnliche Themen

SaniMatthias
Antworten
19
Aufrufe
959
swa00
swa00
O
Antworten
15
Aufrufe
2.970
ORHUX
O
K
Antworten
3
Aufrufe
1.168
Kapikalaani
K
Zurück
Oben Unten