2016-10-03 197 views
0

我尝试一些代码,这里是例外,我得到:在Scheduler.Worker线程上抛出异常。加上`onError`处理

Process: in.ddas.pretense, PID: 8249 
java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling. 
    at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:60) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    at java.lang.Thread.run(Thread.java:818) 
Caused by: rx.exceptions.OnErrorNotImplementedException: Can't create handler inside thread that has not called Looper.prepare() 
    at rx.internal.util.InternalObservableUtils$ErrorNotImplementedAction.call(InternalObservableUtils.java:386) 
    at rx.internal.util.InternalObservableUtils$ErrorNotImplementedAction.call(InternalObservableUtils.java:383) 
    at rx.internal.util.ActionSubscriber.onError(ActionSubscriber.java:44) 
    at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:157) 
    at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120) 
    at rx.exceptions.Exceptions.throwOrReport(Exceptions.java:204) 
    at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:144) 
    at rx.internal.operators.OperatorSubscribeOn$1$1.onNext(OperatorSubscribeOn.java:53) 
    at rx.internal.operators.OperatorTake$1.onNext(OperatorTake.java:77) 
    at rx.internal.operators.OnSubscribeTimerPeriodically$1.call(OnSubscribeTimerPeriodically.java:52) 
    at rx.Scheduler$Worker$1.call(Scheduler.java:134) 
    at rx.internal.schedulers.EventLoopsScheduler$EventLoopWorker$2.call(EventLoopsScheduler.java:187) 
    at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)  
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)  
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)  
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)  
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
    at java.lang.Thread.run(Thread.java:818)  
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
    at android.os.Handler.<init>(Handler.java:200) 
    at android.os.Handler.<init>(Handler.java:114) 
    at in.ddas.pretense.GoogleCloudActivity.PredictionEngine(GoogleCloudActivity.java:198) 
    at in.ddas.pretense.GoogleCloudActivity.lambda$onClick$0(GoogleCloudActivity.java:176) 
    at in.ddas.pretense.GoogleCloudActivity$$Lambda$1.call(Unknown Source) 
    at rx.internal.util.ActionSubscriber.onNext(ActionSubscriber.java:39) 
    at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:139) 
    at rx.internal.operators.OperatorSubscribeOn$1$1.onNext(OperatorSubscribeOn.java:53)  
    at rx.internal.operators.OperatorTake$1.onNext(OperatorTake.java:77)  
    at rx.internal.operators.OnSubscribeTimerPeriodically$1.call(OnSubscribeTimerPeriodically.java:52)  
    at rx.Scheduler$Worker$1.call(Scheduler.java:134)  
    at rx.internal.schedulers.EventLoopsScheduler$EventLoopWorker$2.call(EventLoopsScheduler.java:187)  
    at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)  
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)  
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)  
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)  
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)  
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
    at java.lang.Thread.run(Thread.java:818)  

下面是相同的代码:

try { 
        kf.initFilter(); 
        kg.initFilter(); 
        Observable.interval(1, TimeUnit.SECONDS) 
          .take(5) 
          // switch execution into main thread 
          .subscribeOn(AndroidSchedulers.mainThread()) 
          .subscribe(t -> { 
           PredictionEngine(1); 
          }); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

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(); 
      side_output.append(val + "\n"); 
      new DropboxTask(side_output, "Result", val).execute(); 
     } 
    }, delay); 
} 

我基本上是试图循环运行函数在一定的时间内不阻塞主线程,具有一定的延迟。

我在哪里做错了?

谢谢!

+0

阅读不仅仅是堆栈跟踪的第一行更加它有时重要的实现Looper.prepare()' –

+0

@TylerSebastian我是不是在已经使用'AndroidSchedulers.mainThread()'的主线程上运行我的函数? –

+0

默认构造函数使用* current *线程的循环。你应该使用'Hander h = new Handler(Looper.getMainLooper());' –

回答

1

Handler的默认构造函数使用Looper实例为当前线程。如果您打算在主线程上运行您的代码,并且您的处理程序正在主程序以外的线程中初始化,则需要指定Looper以供处理程序使用。了java.lang.RuntimeException:无法内螺纹创建处理程序已经不叫`所致 - 这可以通过使用

Handler h = new Handler(Looper.getMainLooper());

+1

P.S.喜欢你设计你的网站的方式:) –

+1

@ Jeet.Deir谢谢我绝不是一个设计师,我认为这很聪明。 –