java - Scheduler.Worker 线程上抛出异常。添加 `onError`处理

标签 java android rx-java rx-android

我正在尝试一些代码,这是我得到的异常:

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);
}

我本质上是在尝试循环运行 PredictionEngine(int); 函数一定次数,而不阻塞主线程,并有一定的延迟。

我哪里做错了?

谢谢!

最佳答案

Handler 的默认构造函数使用当前线程的 Looper 实例。如果您打算在主线程上运行代码,并且处理程序在主线程以外的线程中初始化,则需要指定要使用的处理程序的 Looper 。这可以通过使用来完成

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

关于java - Scheduler.Worker 线程上抛出异常。添加 `onError`处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39841631/

相关文章:

java - Matlab java接口(interface): java. io.IOException : The issuer can not be found in the trusted CA list?

java - 在 Google App Engine 中看不到我的自定义日志

java - SpringMVC : No mapping found for HTTP request

java - 无法从 Assets 文件夹中读取图像文件并在 Android 中使用 Intent 共享它?

android - WebView 的 LOAD_NO_CACHE 设置仍然保存文件到磁盘?

java - Rx java将无限流分成组并对每个组单独进行去抖

java - 使用数组列表适配器设置 android listview 的样式

android - 在 Android 中,loader 相对于 Asynctask 的优势是什么?

android - 如果没有 @Provides 或 @Produces 注释的方法,则无法提供 rx.Scheduler

java - 对两个 RxJava 可观察对象(Android)进行基准测试?