Остановка службы Android в действии - PullRequest
0 голосов
/ 12 января 2012

У меня проблемы с ОСТАНОВКОЙ StimulationService, я не уверен, правильно ли я вызываю метод stopservice из своей деятельности. Любая помощь будет высоко ценится.

Активность для запуска и остановки Сервиса

     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) {
                }
            }
        }
    }

}

Ответы [ 2 ]

1 голос
/ 12 января 2012

Во-первых, как отмечает @Waqas, метод onStop() отсутствует. Существует метод onDestroy(), который будет вызываться после вызова stopService().

Во-вторых, вы никогда не останавливаете фоновый поток. Простая установка элемента данных ioio_thread_ на null не останавливает поток. Эта нить будет работать вечно. Пожалуйста, не делайте этого. Если ничего другого, используйте AtomicBoolean вместо аппаратного true в вашей петле while() и переверните это AtomicBoolean на false в onDestroy().

0 голосов
/ 13 января 2012

Ваша деятельность в порядке.Проблема в том, что сервис не убивает IOIOThread.Thread.stop() устарела и не будет делать то, что вы хотите в любом случае.Вам нужно вызвать ioio_.disconnect() из службы onStop() (через метод класса вашего потока), а затем join() поток.См. AbstracIOIOActivity в качестве примера.С небольшими изменениями его можно превратить в AbstractIOIOService, что позволит вам оставить логику для конкретного приложения в подклассе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...