更改变量后,是不是必须重新启动?
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 玩。
线程不依赖于服务,所以你要做的就是在你的服务类中有一个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
当你想重新启动你切换 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 迁移是不是存在危险?