После изменения переменной мне нужно перезагрузить?

У меня есть длинная служба, состоящая из двух потоков.

//MY SERVICE:

if(userEnabledProcessOne) //Shared preference value that I'm getting from the settings of my app based on a checkbox

    processOneThread.start();

if(userEnabledProcessTwo)

    processTwoThread.start();

В принципе, я предоставляю пользователю возможность включить/отключить эти процессы с помощью флажка. Теперь, если пользователь решает отключить один из процессов , пока служба работает, мне нужно перезапустить мою службу с обновленными настройками? Как это?

//In the settings activity of my app
 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    {
        if ( isChecked )
        {
            // Change shared preferences to make the process enabled

 stopService(myService.class)
 startService(myService.class)

        } if (!isChecked)
            // Change shared preferences to make the process enabled


 stopService(myService.class)
 startService(myService.class)
    }

Теперь, когда я изменил свои общие настройки, мне нужно перезапустить мой сервис, состоящий из двух потоков? Нужно ли мне что-то делать с потоками? Является ли это эффективным?

Большое спасибо,

Ruchir

Ответ 1

Хм, это будет слишком сложно протекать слишком сильно, ваш класс обслуживания работает в потоке, если вы вызываете stopSelf(), и, допустим, он является единственным прогоном, поддерживающим MainThread, то он перестанет оставлять два Thread играть вокруг.

Нити не зависят от Сервиса, поэтому вы используете Volatile boolean в своем классе обслуживания, например:

 private volatile boolean killThreads = false;//guess in your case this
 //flag will be binded to the isChecked of the checkbox or even the 
 //interface method

когда вы хотите перезапустить команду toggle killThreads = true;, и теперь, когда вы выполняете свои рабочие нагрузки в Threads, вам нужно сделать, если они находятся в цикле, они должны всегда проверять флаг killThreads, если его истинное время его смерти, если не продолжить, если не в цикле, все равно вам нужно постоянно проверяйте этот флаг после каждой основной строки кода

Пример

//in your Service class
private volatile boolean killThreads = false;
//we have jumped to your thread - i am creating a new instance
while(!killThreads){ //if means if this flag is false keep your loop
//hard code comes here
}
//or if you are not running a loop
//in your run method you can constantly check for this flag like
for(int i =0; i < 100; i++){
   if(killThreads){
      break;//or return if you like
     }
    //rest of the code
 }
 //after the loop you can also check again
 if(killThreads){
    return;
  }

просто проверьте флаг после конкретных строк кода

теперь в вашей деятельности

  //In the settings activity of my app
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
    // Change shared preferences to make the process enabled
   //what you do here is you update killThreads with the isChecked
   //so find a way to bind your bind your Activity to Service class
  //there are tons of example on here

Надеюсь, что это поможет