2016-10-03 82 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(); 
    } 
} 

这有助于!

相关问题