サービスで新しいスレッドを初期化しますが、サービスを開始すると新しいスレッドが作成され、カメラを使用しているためアプリがクラッシュします。そのスレッドの唯一のインスタンスになるようにするにはどうすればよいですか?
スレッドが閉じているとき? 作ったサービスを閉鎖すると、それも閉鎖されますか?
サービスで新しいスレッドを初期化しますが、サービスを開始すると新しいスレッドが作成され、カメラを使用しているためアプリがクラッシュします。そのスレッドの唯一のインスタンスになるようにするにはどうすればよいですか?
スレッドが閉じているとき? 作ったサービスを閉鎖すると、それも閉鎖されますか?
ロックまたは静的変数を使用できます。
private static boolean isThreadRunning;
そしてあなたのサービスで:
if(isThreadRunning)
return;
Thread t=new Thread(new Runnable(){
protected void run(){
isThreadRunning=true;
while(yourcondition){
//your thread code...
}
isThreadRunning=false;
//if you want to start another thread after this one is ended, you should post a message to a handler here and it should start another thread like this
}
});
Handler
これは、スレッド操作で Google が推奨するクラスを使用して実現することもできます。以下のコードは、 での使用方法の一般的な例を示していますService
。
public class MyService extends Service{
private final Handler handler = new Handler();
private final static int RUNABLE_WHAT=6558057;
private final static int PEROID=6*1000;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(!handler.hasMessages(RUNABLE_WHAT))
{
handler.sendMessageDelayed(new Worker().extractMessage(), PEROID);
}
return START_STICKY;
}
private class Worker implements Runnable{
@Override
public void run() {
//DO WORK HERE
handler.sendMessageDelayed(new Worker().extractMessage(), PEROID);
}
private Message extractMessage()
{
Message message = Message.obtain(handler, this);
message.what=RUNABLE_WHAT;
return message;
}
}
}