2012-01-12 16 views
0

StimulationServiceを停止する際に問題が発生しました。自分のアクティビティからstopserviceメソッドを正しく呼び出しているかどうかわかりません。 ご協力いただければ幸いです。アクティビティでAndroidサービスを停止する

活動開始および停止するサービス

 public class Stimulation extends Activity implements OnClickListener { 
    private static final String TAG = "StimulationActivity"; 
    Button buttonStart, buttonStop; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(com.someapp.Activities.R.layout.stimulation); 

    buttonStart = (Button) findViewById(com.someapp.Activities.R.id.ButtonStart); 
    buttonStop = (Button) findViewById(com.someapp.Activities.R.id.ButtonStop); 

    buttonStart.setOnClickListener(this); 
    buttonStop.setOnClickListener(this); 
    } 

    public void onClick(View src) { 
    switch (src.getId()) { 
    case com.someapp.Activities.R.id.ButtonStart: 
     Log.d(TAG, "onClick: starting service"); 
     startService(new Intent(this, StimulationService.class)); 
     break; 
    case com.someapp.Activities.R.id.ButtonStop: 
     Log.d(TAG, "onClick: stopping service"); 
     stopService(new Intent(this, StimulationService.class)); 
     break; 
    } 
    } 
} 

}

サービス

 public class StimulationService extends Service { 
private static final String TAG = "StimulationService"; 
private IOIO ioio_; 
private DigitalOutput led  


private volatile IOIOThread ioio_thread_; 

public IBinder onBind(Intent intent) { 
    return null; 
} 


public void onCreate() { 
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();  
    Log.d(TAG, "onCreate"); 

} 

public void onDestroy() { 
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onDestroy"); 
    ioio_thread_.stop(); 

} 

public void onStart(Intent intent, int startid) { 
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onStart"); 
    ioio_thread_ = new IOIOThread(); 
    ioio_thread_.start(); 

} 

public void onStop(Intent intent, int stopid) { 
    Log.d(TAG, "stop()"); 
    ioio_thread_ = null; 
} 


class IOIOThread extends Thread { 
    private IOIO ioio_; 
    private DigitalOutput led; 

    /** Thread body. */ 
    public void run() { 
     Thread thisThread = Thread.currentThread(); 
     super.run(); 

     while (ioio_thread_ == thisThread) { 
      ioio_ = IOIOFactory.create(); 
      try{ 
       Log.d(TAG, "Wait for IOIO Connection"); 
       ioio_.waitForConnect(); 
       Log.d(TAG, "IOIOConnected"); 

       while (true) { 
        intializePins(); 
        Log.d(TAG, "Pins Intialized"); 
        while(true){ 
         led.write(false); 
         sleep(2000); 
         led.write(true); 
         sleep(2000); 
        } 
       } 

      } 


      catch (ConnectionLostException e) { 
      } catch (Exception e) { 
       Log.e("Hello", "Unexpected exception caught", e); 
       ioio_.disconnect(); 
       break; 
      } finally { 
       try { 
        ioio_.waitForDisconnect(); 
       } catch (InterruptedException e) { 
       } 
      } 
     } 
    } 

}

+0

コードが正しいと思われます。サービスが止まらないとどう思いますか? – waqaslam

+0

アクティビティ画面でサービスを停止するためにクリックすると、IOIOボードのLEDが点滅し続けます。 –

+0

私は今何が起きているのかを知っています。stop()関数の代わりにonDestroy()関数に行くのですか? –

答えて

0

あなたのアクティビティはOKです。問題は、サービスがIOIOThreadを強制終了していないことです。 Thread.stop()は推奨されていません。 サービスのonStop()(スレッドクラスのメソッドを使用)からioio_.disconnect()を呼び出してからjoin()スレッドを呼び出すことです。 例としてAbstracIOIOActivityを参照してください。マイナーな変更を加えれば、AbstractIOIOServiceとなり、アプリケーション固有のロジックをサブクラスに残すことができます。

+0

私はあなたのYtai Ben-Tsviを想定しています。あなたはUSB経由で接続している電話機を使ってIOIOデバイスに電力を供給できますか? –

+0

それは本当に私です。答えはいいえだ。 IOIOはUSBホストです。 – Ytai

1

まず、@Waqasノートとして、存在しない012ありませんメソッド。 stopService()が呼び出された後に呼び出されるonDestroy()メソッドがあります。

第2に、バックグラウンドスレッドをこれまでに止めているわけではありません。単にioio_thread_データメンバをnullに設定しても、スレッドは停止しません。そのスレッドは永遠に動作し続けます。しないでください。それ以外の場合は、while()ループのtrueの代わりにAtomicBooleanを使用し、AtomicBooleanfalseonDestroy()にフリップします。

+0

アドバイスありがとう、このコードにAtomicBooleanをどのように実装しますか? –

+1

@DavidFlanagan:サービスのデータメンバーにしてください。スレッドをフォークする前に 'true'に設定してください。 'while()'ループ(ハードコーディングされた 'true'を置き換えて)で調べてください。 onDestroy()で 'false'に設定してください。さて、私はあなたの 'ioio_thread_ == thisThread'チェックに気付きました。これは' ioio_thread_'を 'volatile'と宣言する必要があるかもしれませんが、同じ問題を解決するかもしれません。 – CommonsWare

関連する問題