サービス内にハンドラがあり、ユーザがサービスを停止するまでこのスレッドをブロックします。 CPU使用量を少なくするために、私はThread.sleep()を使用して、10 minutes
の間隔の後にブロック条件を繰り返し確認しようとしています。ここに私のhandlemessage
の私の実装です:スレッドをハンドラに送信してThread.sleep()を解除するにはどうすればよいですか?
@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);
}
今私の問題は、私は(パブリック関数を通じて)falseにstopServiceの値を変更した場合、それは、whileループを終了するために10分件までかかる場合がありますということです。スレッドの場合は、Thread.interrupt()を使用してwhileループを終了します。
私の質問は、Handlerの場合と同様に、ハンドラ内でThread.sleep()のInterruptedExceptionをスローする方法です。
ありがとうございました。私はリンクしていただきありがとうございます。私はちょうど1つの事を得なかった。あなたは私がそれに割り込みを呼び出すことができるスレッドを解決することができたと述べた。どのように私はスレッドの卿を働かせることができますか? –
それはおそらく難しいでしょう。 (古典的なJavaの世界では、おそらくThreadGroup階層を使用し、名前でスレッドを見つけることになるでしょう)。serviceStopを使用できない場合は、スレッド参照をどこかの変数に記録することをお勧めします... –
ありがとうございました、ついにそれを働かせました。私は 'HandlerThread thread = new HandlerThread(" ServiceStartArguments "、Process.THREAD_PRIORITY_BACKGROUND);を使用するHandlerThreadオブジェクトからThreadインスタンスを取得しました。最後に、 'stopServiceMethod()'のこのスレッド変数に対して割り込みを呼び出しました。 –