更改变量后,是不是必须重新启动?

Posted

技术标签:

【中文标题】更改变量后,是不是必须重新启动?【英文标题】:After changing a variable, do I have to restart?更改变量后,是否必须重新启动? 【发布时间】:2016-05-16 02:46:19 【问题描述】:

我有一个长时间运行的服务,它由两个线程组成。

//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)
    

现在我已经更改了我的共享首选项,是否需要重新启动由两个线程组成的服务?我需要对线程做任何事情吗?这效率高吗?

非常感谢,

鲁基尔

【问题讨论】:

【参考方案1】:

嗯,这样做会泄漏太多,您的 Service 类在线程上运行,如果您调用 stopSelf() 并假设他是唯一一个让 MainThread 保持活动状态的运行,那么它将停止留下两个 Thread s 玩。

线程不依赖于服务,所以你要做的就是在你的服务类中有一个Volatileboolean,就像这样

 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

当你想重新启动你切换 killThreads = true; ,现在在您的线程工作负载的实现中,您需要做的是,如果它们处于循环中,则需要始终检查 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

希望对你有帮助

【讨论】:

感谢您的回答。我不确定你所说的 volatile 布尔值是什么意思。你能举个例子让我更好地理解吗?非常感谢! ☺ 检查我的编辑,看看它是否对你很清楚@RuchirBaronia,另外我想如果你想在这里发布一个问题,让它具体一点,这些***用户不喜欢看到这样的问题,在哪里有很多不同的方法可以实现它,你明白吗?所以,在这里有一个很好的体验。做个好人,祝你成功 我没有绑定任何东西,因为它永远在后台运行。我的问题是,在 for 循环 100 次迭代后我将如何检查?我需要经常检查... hmm 先生,试着理解一点,很好,那么它应该是你从 sharedPreference 中返回的值,而不是 killThreads 标志,它是布尔值,如果你迭代超过 100 个值,任何代码 中的行在 之前执行,我知道你知道,所以再次检查编辑,你会看到它确实检查并终止。@RuchirBaronia 你明白吗?在 for 循环的末尾还有一个 if 语句,所以在循环之后有一个检查 我明白,谢谢,但用户可以随时更改设置,即使在 for 循环完成后也是如此。然后,它不会检查,并且此代码将不起作用。我该如何解决?

以上是关于更改变量后,是不是必须重新启动?的主要内容,如果未能解决你的问题,请参考以下文章

Django + apache & mod_wsgi:更改后必须重新启动 apache

更改操作系统配置和调整后是不是需要重新启动

在 Heroku 上,在实例已经使用更改的模型代码重新启动后,Django syncdb / South 迁移是不是存在危险?

在 IntelliJ 中强制重新加载环境变量...而不重新启动?

从另一个活动重新创建/重新启动活动

通过 PowerShell 更改 DCOM 对象权限后要重新启动啥?