2016-08-20 7 views
3

。 3つのボタンがあります(On、Off、SOS)。アプリはスレッドの割り込みの選択肢はありますか? SOSモードと懐中電灯アプリケーションを構築

//this method gets called when Off button is pressed 
    private void turnOffFlash() { 
      if (FlashOn) { 
       if (myCamera == null || myParameters == null) { 
        return; 
       } 
       myParameters = myCamera.getParameters(); 
       myParameters.setFlashMode(Parameters.FLASH_MODE_OFF); 
       myCamera.setParameters(myParameters); 
       myCamera.stopPreview(); 
       try { 
        if (SOSon) 
         Flashthread.interrupt(); 
        SOSon = false; 
       } catch (Exception ex) { 
        throw ex; 
       } 
       FlashOn = false; 
       number_of_press=0; 
      } 
     } 

(SOSモードがオフのdoesnt)。通常のオンとオフモードではなく、SOSモードで動作し、私がいることを読んで以来 Flashthreadは、 turnOffFlash方法で

void onSOSPress() { 
     if (number_of_press == 1) { 
      try { 
       SOSon = true; 
       if (!Flashthread.isInterrupted()) { 
        if (SOSon) { 
         Flashthread = new Thread(new Runnable() { 
          @Override 
          public void run() { 
           for (int i = 0; i < System.currentTimeMillis(); i++) { 
            if (FlashOn) { 
             myParameters.setFlashMode(Parameters.FLASH_MODE_OFF); 
             myCamera.setParameters(myParameters); 
             FlashOn = false; 
            } else { 
             TurnOnFlash(); 
            } 
            try { 
             Thread.sleep(1000); 
            } catch (InterruptedException e) { 
             e.printStackTrace(); 
            } 

           } 
          } 
         }); 
         Flashthread.start(); 
        } 
       } else 
        Flashthread.resume(); 
      } catch (Exception ex) { 
       throw ex; 
      } 
     } 
    } 

ここで使用されていますInterruptメソッドは本当にスレッドを中断/中断しません。Thread.Interrupt();の代わりに何を使用すればOffボタンを押すとSOSモードが停止しますか?私はstop()destroy()を試みたが、両方のアプリをクラッシュし 。

+1

のような人気のライブラリのいずれかで使用されていますか?代わりに 'Handler'を使うのに何が問題になっていますか? –

+0

「ハンドラ」を使ってSOSモードを試してみます。しかし、一般的に、割り込みが実際に意図した作業をしないこの状況では、私は何をする必要がありますか? –

+0

はまた、可能ならば、あなたは「ハンドラ」を使用して、これを実現するためのコードサンプルを送ってくださいだろうか?ありがとうございました! –

答えて

1

あなたが使用する必要がありますが、コメントで提案されているようにHandlerですが、このシステムに固執したい場合は、停止するためにあなたのスレッドを伝えるためにフラグを使用します。

boolean shouldStop = false; 

... 
while (!shouldStop){ 
    if(FlashOn){ 
    ...//do SOS stuff 
    } 
} 

... 
public void endSOS(){ 
    shouldStop = true; 
} 
+1

が、これは私の問題に加えてちょうど二疑問いくつかの他のコード –

+0

を解決していただきありがとうございます。一度停止したスレッドは再起動できないため、このコードはSOSモードを1回だけ実行しますか? –

+0

ええ、再起動できるように変更することはできますが。しかし、私がやることは、このクラスが何であっても新しいインスタンスをインスタンス化して開始することだけです。理にかなっている? –

1

あなたはThread#interrupt()を使用したいですExceptionがスローされるように強制したい場合。

boolean isClose = false; 

while(!isClose){ 
    try { 
     // Your code here 
    } catch (InterruptedException e) { 
    if(isClose){ 
     break; 
    } 
    } 
} 

public void killThread(){ 
    isClose = true; 
    interrupt(); 
} 

コードを実装します。

MyCustomThread t = new MyCustomThread(....); 

// Assuming that the thread is already running 
t.killThread(); 

このアプローチは、多くの場合、なぜ始まるとのすべてのスレッドを殺す、このような複雑なシステムを使用するなどVolley

関連する問題