서비스가 MyService
입니다. 내 서비스에서, 나는 control_Value()
함수에 의해 제어되는 글로벌 변수 value
을 가지고있다. value
의 값을 제어하는 데 사용되는 함수는 다음과 같습니다.Thead.sleep()은 Service에서 좋은 접근 방법이라고 생각합니까?
함수를 호출 할 때를 초기 시간이라고합니다. 초기 값은
One
으로 설정됩니다. 초기 시간에서 3 초 후 값은Zero
으로 설정됩니다. 함수가 다시 호출 될 때까지 값은Zero
을 유지합니다.public void control_Value()(){ value="One"; try{ Thread.sleep(3000); value="Zero"; } catch{} }
당신은 (3000) Thead.sleep 좋은 방법입니다 생각하십니까 다음과 같이 규정에 근거
위, 나는 control_Value()
을 썼다? 그렇지 않은 경우 더 나은 해결책을 제공하십시오. 위의 기능이 잘 작동한다는 점에 유의하십시오.
이
내 서비스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();
}
}
업데이트는 다음과 SMS 전화에 올 때 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'로 재설정됩니다. – user3051460
'onStartCommand() 'value '가 0이 될 때까지 리턴 할 수있다. 값이 비동기 적으로 변경 될 수 있다면 [IntentService] (https://developer.android.com/guide/components/services.html#ExtendingIntentService)가 적합 할 수 있습니다. 그렇지 않다면 시작과 현재 시간의 차이를 확인하는 루프가 충분할 것입니다. 또는 Java 동기화 메커니즘을 사용하십시오. – Onik