2016-10-23 2 views
0

私はMyServiceというサービスを持っています。私のサービスでは、私はグローバル変数を持っています:valueこれは、関数control_Value()によって制御されます。 valueの値を次のように制御する関数。Thead.sleep()はサービスの良いアプローチだと思いますか?

関数を呼び出す時を初期時刻といいます。初期値では、値は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(); 
    } 
} 

更新私のサービスです: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まで返ります。 'value'を非同期に変更できる場合は、[IntentService](https://developer.android.com/guide/components/services.html#ExtendingIntentService)が適しています。そうでない場合は、開始時刻と現在時刻の差を確認するループで十分でしょう。または、Java同期メカニズムを使用します。 – Onik

答えて

1

の提案からカウントダウンタイマーを使用したソリューションであるあなたがThead.sleep(3000)は良い方法だと思いますか?

サービスはUIなしでアプリケーションのメインスレッド上で実行されます。特定の秒間アプリケーションメインスレッドを保持している場合、アプリケーションはANRメッセージを表示します。あなたが特定の秒後に操作を実行する場合は、あなたが方法定期的な間隔とonFinishヒットのonTickヒットは時間onTick & onFinishを持っているあなたのサービスでCountDownTimerを使用することができますどのような

を行うには

アップです。

+0

ありがとうございます。 1分前に私の質問を更新しました。それを確認できますか?ブロードキャストがSMSとして受信されたときに呼び出される別の関数に 'controValue()'関数を移します。 – user3051460

+0

'onSMSContentReceived'が呼び出されるまでサービスが実行されていればOKです。 –

+0

ありがとうございます。 CounterDown Timerメソッドを調べました。それはよく見えた。しかし、私はキャンセルとインタールについて覚えています。たとえば、 'controlValue'関数で使用すると、' controlValue'が呼び出されるたびにCounterDown Timerを呼び出します。例えば、私は3つの着信SMSを持っています、そして、それは 'controlValue'をキャンセルせずに3回呼び出します。 (キャンセルはonDestroy()を呼び出していると思うので) – user3051460

関連する問題