2016-10-03 78 views
0

所以我有這種方法稱爲PredictionEngine(int),我想運行一定的時間與每次運行之間的一定的時間延遲。該方法是這樣的:運行一定的時間的方法

private void PredictionEngine(int delay) throws Exception { 

    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      enableStrictMode(); 
      String val = null; 
      try { 
       if (tHighPass == 0 && tLowPass == 0 && tKalman == 1) { 
        //Magic 
       } else { 
        //Magic 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      enableStrictMode(); 
      new DropboxTask(side_output, "Result", val).execute(); 
     } 
    }, delay); 
} 

中顯而易見,我運行在主線程的網絡操作,因爲這是一個研究應用,並沒有客戶端曾經打算使用它。

我想讓整個函數運行一個100次,並且延遲一段時間,比如2秒。最初的想法是這樣做的:

for(loop 100 times){ 
    PredictionEngine(int) 
    Thread.sleep(2000); //sorry for StackOverflow programming. 
} 

但是我不想阻塞主線程,因爲我正在讀取一些傳感器數據。任何想法都是非常有幫助的!

謝謝。

+0

[定時器](https://developer.android.com/reference/java/util/Timer.html) – Onik

回答

1

解決此問題的最佳方法是使用rxJava庫,因爲它允許創建,修改和使用事件流。您可以在幾行代碼中實現所有內容並進行修改,以便在後臺執行操作。

Observable.interval(1, TimeUnit.SECONDS) 
       .take(100) 
       // switch execution into main thread 
       .subscribeOn(AndroidSchedulers.mainThread()) 
       .subscribe(t -> { 
        doSomethingOnMainThread(); 
       }); 

另一方面,還有另一種解決方案 - 您可以使用Handler,它通常用於線程通信。它有方法.postDelayed()允許您推遲執行任務。 Handler可以方便地與HandlerThread一起使用。但是,rxJava是解決您的問題更方便和簡單的方法。

+0

在添加了庫和所有,它說無法找到'AndroidSchedulers'類。我錯過了什麼? –

+1

對於AndroidSchedulers你也應該使用rxAndroid:compile'io.reactivex:rxjava:1.0.13' compile'io.reactivex:rxandroid:0.25.0' –

+0

謝謝,這個解決了! –

1

在創建你的處理器,你可以提供一個活套作爲基於不同的線程,則主線程的構造函數的參數之一:由MyHandler的接收

HandlerThread thread = new HandlerThread("Thread name", android.os.Process.THREAD_PRIORITY_BACKGROUND); 
thread.start(); 
Looper looper = thread.getLooper(); 
Handler handler = new MyHandler(looper); 

消息將在一個獨立的線程來處理,使UI線程不受干擾。

要在週期性任務循環,使用類似:

for (int i=0; i<100; i++){ 
    handler.postDelayed(new Runnable(){ 
     ... 
     ... 
     ... 
    }, i*delay); 
} 

這樣,如果你決定了週期性任務需要取消,你隨時都可以調用:

handler.removeCallbacksAndMessages(null); 
0

我試圖解決這一問題,而不會阻塞主線程 如下我創建的工作線程的主線程循環和仍在運行predictionEngine()

MyThread t = new MyThread(2000, 3000); // delay and sleep 
t.startExecution(); 

工作線程類看起來如下

class MyThread extends Thread{ 
    private int delay; 
    long sleep; 

    MyThread(int delay, long sleep){ 
     this.delay = delay; 
     this.sleep = sleep; 
    } 

    @Override 
    public void run() { 
     for(int i = 0; i < 100; i++){ 
      try { 
       MainActivity.this.runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         predictEngine(delay); 
        } 
       }); 
       Log.i("Mtali","About to pause loop before next predict"); 
       sleep(sleep); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    void startExecution(){ 
     start(); 
    } 
} 

這有助於!

相關問題