2017-08-07 17 views
0

1つのスレッドを2秒間実行させ、別のスレッドを3秒間実行させる方法を見つけようとしています。私は以下のランナブルを使用しています:Android/Java - ハンドラまたはスケジューラを使用してランナブルを遅延させますか?

private Runnable setLocation, checkWriteAttempt; 

{ 
    setLocation = new Runnable() { 
     @Override 
     public void run() { 
      // Get Location 
      String location = FM.getLocation(SingletonSelectedMAC.getMAC()); 
      Log.e("Lockdown Pin", "Room Number = " + location); 
      mConfirm.setEnabled(false); 
      mCancel.setEnabled(false); 
     } 
    }; 

    checkWriteAttempt = new Runnable(){ 
     @Override 
     public void run(){ 

      if(SingletonWriteData.getWasDataWritten()){ 
       startAlertActivity(); 
      } 
      else{ 
       restartActivity(); 
      } 

     } 
    }; 
} 

私はスレッドを開始するには、以下のメソッド "tryToWriteData"を呼び出しています。

最初の試みは、postDelayedを使用して一定時間スレッドを実行するハンドラを使用することでした。しかし、runnable "setLocation"と "checkWriteAttempt"は同時に実行されますが、私のプログラムでは動作しません。それ以外にも、新しい活動が始まり、うまくいくでしょう。

後で、私はScheduledExecutorを使ってみました。しかし、この方法を使うと、自分のアンドロイドデバイスで私の活動は変わらず、実行時に実行ファイルからLog.e出力を受け取ることはありません。実行可能ファイルは、Bluetoothデバイス(ライト)にデータを送信しているため、確実に呼び出されています。以下を参照してください:

public void attemptToWriteData(){ 
     scheduledExecutor.scheduleWithFixedDelay(setLocation, 0, 2, TimeUnit.SECONDS); 
     scheduledExecutor.scheduleWithFixedDelay(checkWriteAttempt, 2, 3, TimeUnit.SECONDS); 

     scheduledExecutor.shutdown(); 

     /* 
     mHandler.postDelayed(setLocation, 2000); 
     mHandler2.postDelayed(checkWriteAttempt, 3000); 
     */ 
    } 

両方のスレッドがBluetoothデバイスからの背景情報を処理する時間を必要とし(それが仕事に関係あるように私はランナブルからこの部分を省略しています)。

ありがとうございました!

+0

https://stackoverflow.com/questions/2029118/run-code-for-x-seconds-in-javaを参照してください。 – Oleg

答えて

0

1つのスレッドを2秒間実行するには、スレッドを3秒間実行する必要があります。そのため、スレッドを中断した場所からスレッドがピックアップできるように、作業を分割する必要があります。

固定秒数ごとにタスクを実行する方が簡単です。 ScheduledExecutorでのあなたのアプローチは、主なアンドロイドスレッドではなくUIを更新しようとしたためにおそらく動作しません。

RxAndroidライブラリを使用して以下の解決策を試してください。

Observable<Integer> o = Observable.merge(
    Observable.interval(2, TimeUnit.SECONDS).map(t -> setLocation), 
    Observable.interval(3, TimeUnit.SECONDS).map(t -> checkWriteAttempt) 
) 
.map(c -> c.call()) 
.subscribeOn(Schedulers.single()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(computationResult -> /*update UI here*/); 

このコードは、呼び出し可能オブジェクトが同時におよびUIの更新が上で実行されていることを実行しないことを確認します:あなたは、そう、彼らはその後、UIを更新するために使用することができ、計算の結果を返すあなたのRunnableCallableに変換する必要がありますメインスレッド

関連する問題