【问题标题】:Do you think Thead.sleep() is a good approach in Service?您认为 Thread.sleep() 是 Service 中的好方法吗?
【发布时间】: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


【解决方案1】:

您认为 Thead.sleep(3000) 是一个好方法吗?

从来没有。服务在没有 UI 的应用程序主线程上运行。如果您持有应用程序主线程几秒钟,应用程序将提示 ANR 消息。

做什么

如果你想在几秒钟后执行操作,那么你可以在你的服务中使用CountDownTimer,它有onTickonFinish方法,其中onTick定期命中,onFinish在时间到时命中.

【讨论】:

  • 谢谢。我在 1 分钟前更新了我的问题。你能检查一下吗?我将 controValue() 函数移动到另一个函数,当广播作为 SMS 接收时调用该函数
  • 如果你的服务一直在运行直到onSMSContentReceived被调用,这也是可以的。
  • 谢谢。我查看了 CounterDown Timer 方法。看起来不错。但我对取消和初始化它感到不安。例如,如果我在 controlValue 函数中使用它,那么每当调用 controlValue 时,它看起来都会调用 CounterDown Timer。例如,我收到了 3 条短信,那么它会呼叫controlValue 3 次而不取消。 (因为我认为取消是调用 onDestroy())
  • onFinish 将在 X 秒后调用一次,您需要调用 controlValue
  • 好像没问题,继续吧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2020-03-28
相关资源
最近更新 更多