2016-10-22 3 views
0

Serviceを作成しようとしています。このServiceでは、私は、この変数をahve:Androidで3秒後に変数をリセットするにはどうすればよいですか?

String command="Go" 

私はこれを行う機能をデザインしたい:3秒以内

を、コマンドが時間場合

を「行く」の値を返します。が3秒より大きい場合、コマンドは「」にリセットされます。

私の現在の解決策はThreadです。あなたはそれが安全で良い解決策だと思いますか?

public String command; 

public String getValue(){ 
    command="GO"; 
    try { 
     Thread.sleep(3000); 
     command=""; 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    return command; 
} 

答えて

-1

より良いアプローチは、ハンドラを使用することで、代わりにThread.sleep()postDelayedでしょう。

postDelayedは、ハンドラスレッドのメッセージキューにRunnableを格納します。制御がスレッドのルーパーに戻ると、メッセージキューが処理されます。

Thread.sleep()スレッドをブロックします。

final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
     //Do stuff every 3000 ms 
     handler.postDelayed(this, 3000); 
     } 
    }, 1500); 
+0

私はそれを試して、エラーを返しました。ルックスにはrunUIスレッドが必要です。私はサービス中です – user3051460

+0

あなたの仕事のための完璧なソリューションです。ちょうどトーストとハンドラコードを削除してください(反復の原因となるので、反復を繰り返す場合はそれを保持してください)、コードを変数リセットに置き換えてください。 –

+0

@user3051460 Toastを実際のコード? – Manos

0

あなたはMainThreadでアプリをそれをやっているように、ユーザになりません応答とそれが起こることができる最悪のことです! RXJavaを使用し、UIスレッドをブロックすることに注意してください。

Observable.just(comment) 
      .delay(3, TimeUnit.SECONDS) 
      /*for doing at background*/ 
      .subscribeOn(Schedulers.io()) 
      /*for responsing at maint thread*/ 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Action1<String>() { 
       @Override 
       public void call(String s) { 
        comment = ""; 
        // and other stuffs you wand after resetting the val 
       } 
      }); 
0

(すでにスレッドを有することに基づいて)良い方法は、これを次のようになります。

long elapsed = (System.nanoTime()-startTime)/1000000; 
if(elapsed>3000) { 

    //reset your variable 

    //Allow this to repeat: 
    startTime = System.nanoTime(); 
} 

初期化するためには、あなたが活動を初期化しますstartTime = System.nanoTime();を行います。

この方法には大きな欠点があります。スレッドで使用する必要があります。ボタンを押して3秒後ではなく3秒後に更新したい場合は、リスナーとして単独で使用することはできません。

何かを何度もやりたいが、バックグラウンドメモリのホギングに気をつけたいのであれば、スレッドを使うのは良い考えです。非同期スレッドを作成することができます

+0

ありがとうございます。あなたのコードでスレッドを使用していますか?あなたのコードにスレッドコードが見当たりませんでした。繰り返す必要はないので、 'startTime = System.nanoTime();'という行は必要ないと思います。 Besieds、 'long startTime = 0'の初期値です。そうですか? – user3051460

+0

startTime =初期化するSystem.nanoTime。これを呼び出す前に行う必要があります。 startTimeはlongです。スレッドは単なる実行可能です。ここで速度を制限する必要はありません。あなたが望む任意のスレッドを使用してください。あなたがアプリケーションを起動する2番目からこれを繰り返し実行したい場合は、開始時にstartTime = System.nanoTime()を使用する必要があります。 – Zoe

関連する問題