私のサービスは新しいスレッドを生成し、interrupt()のメソッドtypically recommended javaに従ってそれを停止します。サービスを停止すると、onDestroy()のスレッドが停止します。サービスが停止され、割り込みコードに達する。しかし、すぐにスレッドはRunnableの先頭から再開します。スレッドが停止していないのはなぜですか?
public class DoScan extends Service {
public volatile Thread runner;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
startThread();
}
@Override
public void onDestroy() {
super.onDestroy();
android.util.Log.v("@@@@@@@@@@@@@@@@@@@@", "DoScan.onDestroy");
stopThread();
}
public synchronized void startThread(){
if(runner == null){
android.util.Log.v("@@@@@@@@@@@@@@@@@@@@", "DoScan.startthread");
runner = new Thread(new ScanningThread());
runner.start();
}
}
/* use a handler in a loop cycling through most of oncreate.
* the scanningthread does the work, then notifies the svc's uithread
*/
public synchronized void stopThread(){
if(runner != null){
android.util.Log.v("@@@@@@@@@@@@@@@@@@@@", "DoScan.stopthread");
Thread moribund = runner;
runner = null;
moribund.interrupt();
android.util.Log.v("@@@@@@@@@@@@@@@@@@@@", "interrupted?" + moribund.isInterrupted());
}
}
}
実際には例外は発生しません。中断されたことが検出された場合、一部の呼び出しは例外を戻しますが、ほとんどの場合、作業を中断するのに適したThread.isInterrupted()をチェックして、自分で検出を行う必要があります。 – Fredrik