【发布时间】:2016-10-23 13:22:25
【问题描述】:
我有一个MyService 的服务。在我的服务中,我有一个全局变量:value,它由函数control_Value() 控制。用于控制变量value值的函数如下规则:
调用函数的时间称为初始时间。最初,该值设置为
One。从初始时间开始 3 秒后,该值设置为Zero。该值将保持Zero直到再次调用该函数。
根据上面的规则,我写了control_Value()如下:
public void control_Value()(){
value="One";
try{
Thread.sleep(3000);
value="Zero";
}
catch{}
}
您认为 Thead.sleep(3000) 是一个好方法吗?如果没有,请给我一个更好的解决方案。请注意,上述函数运行良好。
这是我的服务
public class MyService extends Service {
String value=null;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//TODO do something useful
return Service.START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
//TODO for communication return IBinder implementation
return null;
}
@Subscribe
public void onSMSContentReceived(OnSMSReceiverEvent event) {
control_Value();
}
}
更新:当收到短信时会自动拨打onSMSContentReceived。
这是使用 TGMCians 建议的倒数计时器的解决方案
//Global variable
private CountDownTimer mCountDownTimer;
//
@Override
protected void onDestroy() {
if(mCountDownTimer!=null){
mCountDownTimer.cancel();
}
super.onDestroy();
}
public void control_Value()(){
mCountDownTimer = new CountDownTimer(3000,1000) {
@Override
public void onTick(long millisUntilFinished) {
value="One";
}
@Override
public void onFinish() {
// Your stuff
value="Zero";
}
};
mCountDownTimer.start();
}
【问题讨论】:
-
“你认为 Thead.sleep(3000) 是个好方法吗?” 不,在这种情况下你阻塞了主线程。 AFAIK,如果您的睡眠时间超过 5 秒,您将获得 ANR。
-
谢谢 Onik。你的建议是什么?上述函数的使用场景如下:“当函数被调用时,
value将在3秒内变为One,之后value重置为Zero” -
这取决于
onStartCommand()是否可以返回直到value= 0。如果value可以异步更改,那么IntentService 可能会很合适。如果没有,我想一个循环检查开始时间和当前时间之间的差异就足够了。或者使用 Java 同步机制。 -
为简单起见,在我的示例中,我只是在
onStartCommand()中调用函数controlValue()。在实际情况下,我调用 SMS 的 BroacastReceiver 中的函数。因此,我认为它将是独立的,返回值为onStartCommand()。基于此,我认为第二种解决方案可能会很好。对吗? -
我更新了它以使其成为真实案例。你不需要考虑
onStartCommand()函数
标签: android multithreading service handle