私は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();
}
_「Thead.sleep(3000)は良いアプローチだと思いますか?」_この場合、メインスレッドをブロックしています。 AFAIK、5秒以上寝るとANRを受けるでしょう。 – Onik
オニクに感謝します。あなたの提案は何ですか?上記の関数は以下のシナリオのように使用されます: "関数が呼び出されると、' value'は3秒以内に 'One'になり、' value'は 'Zero'にリセットされます。 – user3051460
' onStartCommand() 'value '= 0まで返ります。 'value'を非同期に変更できる場合は、[IntentService](https://developer.android.com/guide/components/services.html#ExtendingIntentService)が適しています。そうでない場合は、開始時刻と現在時刻の差を確認するループで十分でしょう。または、Java同期メカニズムを使用します。 – Onik