Ich habe einen Handler, der sich in einem Service befindet, und ich blockiere diesen Thread, bis der Benutzer den Dienst beendet. Um es weniger CPU-intensiv zu machen, versuche ich Thread.sleep() zu benutzen und wiederhole die Blockierungsbedingung nach einem Intervall von 10 minutes
. Hier ist meine Umsetzung meines handlemessage
:Wie sende ich einen Interrupt an einen Handler, um eine Thread.sleep() zu brechen?
@Override
public void handleMessage(Message msg) {
Log.e("Service", "looper started");
GPSThread gp=new GPSThread(getApplicationContext());
gp.start();
ModeController mc=new ModeController(getApplicationContext());
mc.start();
NetworkSniffer nh=new NetworkSniffer(getApplicationContext());
nh.start();
while(stopService) //stopService is a volatile boolean i use to block until user opts to stop the service
{
try {
Thread.sleep(10*60*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
mc.stopThread();
gp.stopThread();
nh.stopNetworkThread();
stopSelf(msg.arg1);
}
Nun mein Problem ist, dass wenn ich den Wert von Stopservice auf false ändern (durch eine öffentliche Funktion) könnte es bis zu 10 Minuten dauern, die while-Schleife zu beenden. Wenn es ein Thread wäre, hätte ich eine Thread.interrupt() verwendet und die While-Schleife beendet.
Also meine Frage ist, wie erreiche ich eine ähnliche Sache für Handler, d. H., Wie eine InterruptedException für Thread.sleep() in einem Handler zu werfen.
Vielen Dank für die Links Herr, ich gehe durch sie. Ich habe nur eine Sache nicht bekommen. Du hast gesagt, wenn ich den Thread ausarbeiten könnte, könnte ich einen Interrupt darauf ansetzen. Wie kann ich den Thread Sir erarbeiten? –
Es wäre wahrscheinlich schwierig. (In der klassischen Java-Welt würden Sie wahrscheinlich die ThreadGroup-Hierarchie verwenden und den Thread nach dem Namen suchen. Aber das ist eine schlechte Idee.) Wenn Sie serviceStop nicht verwenden können, ist es am besten, die Thread-Referenz in einer Variablen zu speichern ... –
Danke Sir, endlich hat es funktioniert. Ich habe die Thread-Instanz vom HandlerThread-Objekt, das ich HandlerThread thread = new HandlerThread ("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND) verwende; '. Schließlich habe ich einen Interrupt für diese Threadvariable in 'stopServiceMethod()' aufgerufen. –