2016-10-23 3 views
0

서비스가 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(); 
} 
+1

_ "Thead.sleep (3000)은 좋은 접근 방법이라고 생각하십니까?"_ 아니요.이 경우 주 스레드를 차단하고 있습니다. AFAIK, 5 초 이상 잠을 자면 ANR이 발생합니다. – Onik

+0

감사합니다. 당신의 제안은 무엇입니까? 위의 함수는 다음과 같은 시나리오로 사용됩니다 : "함수가 호출 될 때'value'는 3 초 내에'One'이되고,'value'는'Zero'로 재설정됩니다. – user3051460

+0

'onStartCommand() 'value '가 0이 될 때까지 리턴 할 수있다. 값이 비동기 적으로 변경 될 수 있다면 [IntentService] (https://developer.android.com/guide/components/services.html#ExtendingIntentService)가 적합 할 수 있습니다. 그렇지 않다면 시작과 현재 시간의 차이를 확인하는 루프가 충분할 것입니다. 또는 Java 동기화 메커니즘을 사용하십시오. – Onik

답변

1

당신은 Thead.sleep (3000) 좋은 방법입니다 생각하십니까?

UI가없는 응용 프로그램 주 스레드에서 서비스가 실행됩니다. 응용 프로그램 주 스레드를 몇 초 동안 보유 할 경우 응용 프로그램에서 ANR 메시지를 표시합니다. 특정 초 후에 작업을 수행하려는 경우,

을 할 다음 onTick & onFinish 경우 일정한 간격에 onTick 안타 onFinish 안타 때 시간이 메소드가 서비스에 CountDownTimer을 사용할 수 있습니다 무엇

일어나있다.

+0

고맙다. 1 분 전에 질문을 업데이트했습니다. 확인해 주시겠습니까?브로드 캐스트가 SMS로 수신 될 때 호출되는 다른 함수로'controValue()'함수를 이동합니다. – user3051460

+0

'onSMSContentReceived'가 호출 될 때까지 서비스가 실행 중이면 OK입니다. –

+0

감사합니다. CounterDown Timer 메서드를 살펴 보았습니다. 잘 보였다. 그러나 취소와 intial 그것에 관하여 woory이다. 예를 들어,'controlValue' 함수에서 사용하면'controlValue'가 호출 될 때마다 CounterDown Timer를 호출합니다. 예를 들어, 나는 3 개의 들어오는 SMS를 가지고있다, 그리고 그것은'controlValue'를 취소없이 3 번 부를 것이다. (왜냐하면 나는 cancel이 onDestroy()를 호출한다고 생각하기 때문입니다. – user3051460

관련 문제