2016-09-22 26 views
0

我在我的android應用程序中使用RxJava。我正在使用interval()函數使用計時器,但即使添加了onBackPressureDrop(),我仍然得到Missing Backpressure異常。我還爲我的訂戶添加了onError(),並將異常記錄到Crashlytics,但它仍然崩潰。請幫忙。我花了一個星期的時間來解決問題,但無濟於事。代碼偶爾崩潰,我甚至一次都無法重現它。 TraceonError已直接從rxjava git的官方問題中獲取。我認爲這是一個負責打印Crashlytics例外的人,儘管我可能是錯的。即使使用適當的運算符後,RxJava代碼中的BackPressure異常

我的延遲可觀察 -

serviceStartSubscription = Observable.just(1) 
       .delay(delay, TimeUnit.SECONDS) 
       .onBackpressureDrop() 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<Integer>() { 
        @Override 
        public void onCompleted() { 

        } 

        @Override 
        public void onError(Throwable throwable) { 
         Log.e("Service", "Service not started"); 
         Crashlytics.logException(throwable); 
         Crashlytics.log("Error while starting service in Orders Home class"); 
        } 

        @Override 
        public void onNext(Integer integer) { 
         iOmsOrdersHomeScreenActivity.startService(); 
        } 
       }); 

我觀察到的 -

public static Subscription createTimer(long expiryTime, @NonNull Subscriber<Long> subscriber) { 
    return Observable.interval(1, 10, TimeUnit.SECONDS) 
      .onBackpressureDrop() 
      .lift(traceOnError()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(subscriber); 
} 

traceonError() -

public class OperatorTraceOnError<T> implements Observable.Operator<T, T> { 

    private final StackTraceElement[] trace = new Throwable().getStackTrace(); 

    public static <T> OperatorTraceOnError<T> traceOnError() { 
     return new OperatorTraceOnError<>(); 
    } 

    @Override 
    public Subscriber<? super T> call(Subscriber<? super T> child) { 
     Subscriber<T> parent = new Subscriber<T>() { 
      @Override 
      public void onCompleted() { 
       child.onCompleted(); 
      } 

      @Override 
      public void onError(Throwable throwable) { 
       child.onError(new TracedException(throwable, trace)); 
      } 

      @Override 
      public void onNext(T subscriber) { 
       child.onNext(subscriber); 
      } 
     }; 

     child.add(parent); 
     return parent; 
    } 

    private static class TracedException extends RuntimeException { 
     public TracedException(Throwable throwable, StackTraceElement[] trace) { 
      super(throwable); 
      setStackTrace(trace); 
     } 
    } 
} 

崩潰 -

Caused by rx.exceptions.OnErrorNotImplementedException 
rx.internal.util.InternalObservableUtils$ErrorNotImplementedAction.call (InternalObservableUtils.java:386) 
rx.internal.util.InternalObservableUtils$ErrorNotImplementedAction.call (InternalObservableUtils.java:383) 
rx.internal.util.ActionSubscriber.onError (ActionSubscriber.java:44) 
rx.observers.SafeSubscriber._onError (SafeSubscriber.java:157) 
rx.observers.SafeSubscriber.onError (SafeSubscriber.java:120) 
rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.checkTerminated (OperatorObserveOn.java:276) 
rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call (OperatorObserveOn.java:219) 
rx.internal.schedulers.ScheduledAction.run (ScheduledAction.java:55) 
android.os.Handler.handleCallback (Handler.java:733) 
dalvik.system.NativeStart.main (NativeStart.java) 
Caused by rx.exceptions.MissingBackpressureException 
rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.onNext (OperatorObserveOn.java:162) 
rx.internal.operators.OperatorSubscribeOn$1$1.onNext (OperatorSubscribeOn.java:53) 
rx.internal.operators.OnSubscribeTimerPeriodically$1.call (OnSubscribeTimerPeriodically.java:52) 
rx.Scheduler$Worker$1.call (Scheduler.java:134) 
rx.internal.schedulers.EventLoopsScheduler$EventLoopWorker$2.call (EventLoopsScheduler.java:187) 
rx.internal.schedulers.ScheduledAction.run (ScheduledAction.java:55) 
java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:422) 
java.lang.Thread.run (Thread.java:841) 
#0 
MarketingHandler 
Raw Text 
android.os.MessageQueue.nativePollOnce (MessageQueue.java) 
android.os.HandlerThread.run (HandlerThread.java:61) 
#1 
FirebaseWorker 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#2 
AsyncTask #3 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#3 
RxScheduledExecutorPool-1 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#4 
OkHttp ConnectionPool 
Raw Text 
java.lang.Object.wait (Object.java) 
okhttp3.ConnectionPool$1.run (ConnectionPool.java:65) 
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112) 
java.lang.Thread.run (Thread.java:841) 
#5 
Binder_2 
Raw Text 
dalvik.system.NativeStart.run (NativeStart.java) 
#6 
ManifestHandler 
Raw Text 
android.os.MessageQueue.nativePollOnce (MessageQueue.java) 
android.os.HandlerThread.run (HandlerThread.java:61) 
#7 
RxIoScheduler-10 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#8 
RxIoScheduler-11 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#9 
AsyncTask #2 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#10 
Okio Watchdog 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Object.wait (Object.java:364) 
okio.AsyncTimeout.awaitTimeout (AsyncTimeout.java:311) 
okio.AsyncTimeout.access$000 (AsyncTimeout.java:40) 
okio.AsyncTimeout$Watchdog.run (AsyncTimeout.java:286) 
#11 
RxComputationScheduler-2 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#12 
AnalyticsHandler 
Raw Text 
android.os.MessageQueue.nativePollOnce (MessageQueue.java) 
android.os.HandlerThread.run (HandlerThread.java:61) 
#13 
Crashlytics Exception Handler1 
Raw Text 
dalvik.system.VMStack.getThreadStackTrace (VMStack.java) 
java.lang.Thread.getAllStackTraces (Thread.java:521) 
com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.writeSessionEvent (CrashlyticsUncaughtExceptionHandler.java:1009) 
com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.writeFatal (CrashlyticsUncaughtExceptionHandler.java:766) 
com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.handleUncaughtException (CrashlyticsUncaughtExceptionHandler.java:262) 
com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.access$100 (CrashlyticsUncaughtExceptionHandler.java:55) 
com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler$5.call (CrashlyticsUncaughtExceptionHandler.java:238) 
com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler$5.call (CrashlyticsUncaughtExceptionHandler.java:235) 
java.util.concurrent.FutureTask.run (FutureTask.java:237) 
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587) 
io.fabric.sdk.android.services.common.ExecutorUtils$1$1.onRun (ExecutorUtils.java:75) 
io.fabric.sdk.android.services.common.BackgroundPriorityRunnable.run (BackgroundPriorityRunnable.java:30) 
java.lang.Thread.run (Thread.java:841) 
#14 
RxComputationScheduler-4 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#15 
RxComputationScheduler-1 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#16 
RxSchedulerPurge-1 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#17 
RxIoScheduler-3 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#18 
RxIoScheduler-2 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#19 
Binder_1 
Raw Text 
dalvik.system.NativeStart.run (NativeStart.java) 
#20 
main 
Raw Text 
java.lang.Object.wait (Object.java) 
java.util.concurrent.FutureTask.get (FutureTask.java:174) 
com.crashlytics.android.core.CrashlyticsExecutorServiceWrapper.executeSyncLoggingException (CrashlyticsExecutorServiceWrapper.java:44) 
com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.uncaughtException (CrashlyticsUncaughtExceptionHandler.java:235) 
java.lang.ThreadGroup.uncaughtException (ThreadGroup.java:693) 
java.lang.ThreadGroup.uncaughtException (ThreadGroup.java:690) 
rx.internal.schedulers.ScheduledAction.run (ScheduledAction.java:66) 
android.os.Handler.handleCallback (Handler.java:733) 
dalvik.system.NativeStart.main (NativeStart.java) 
#21 
ProfileHandler 
Raw Text 
android.os.MessageQueue.nativePollOnce (MessageQueue.java) 
android.os.HandlerThread.run (HandlerThread.java:61) 
#22 
RxIoScheduler-12 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#23 
pool-4-thread-1 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#24 
fifo-pool-thread-0 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
com.bumptech.glide.load.engine.executor.FifoPriorityThreadPoolExecutor$DefaultThreadFactory$1.run (FifoPriorityThreadPoolExecutor.java:118) 
#25 
RxIoScheduler-9 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#26 
Queue 
Raw Text 
java.lang.Object.wait (Object.java) 
java.util.concurrent.PriorityBlockingQueue.take (PriorityBlockingQueue.java:510) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.performOperation (DependencyPriorityBlockingQueue.java:197) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.get (DependencyPriorityBlockingQueue.java:236) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take (DependencyPriorityBlockingQueue.java:65) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take (DependencyPriorityBlockingQueue.java:46) 
java.util.concurrent.ThreadPoolExecutor.getTask (ThreadPoolExecutor.java:1035) 
java.lang.Thread.run (Thread.java:841) 
#27 
OkHttp ConnectionPool 
Raw Text 
java.lang.Object.wait (Object.java) 
okhttp3.ConnectionPool$1.run (ConnectionPool.java:65) 
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112) 
java.lang.Thread.run (Thread.java:841) 
#28 
RxScheduledExecutorPool-2 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#29 
Queue 
Raw Text 
java.lang.Object.wait (Object.java) 
java.util.concurrent.PriorityBlockingQueue.take (PriorityBlockingQueue.java:510) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.performOperation (DependencyPriorityBlockingQueue.java:197) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.get (DependencyPriorityBlockingQueue.java:236) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take (DependencyPriorityBlockingQueue.java:65) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take (DependencyPriorityBlockingQueue.java:46) 
java.util.concurrent.ThreadPoolExecutor.getTask (ThreadPoolExecutor.java:1035) 
java.lang.Thread.run (Thread.java:841) 
#30 
RxIoScheduler-8 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#31 
RxIoScheduler-1 (Evictor) 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#32 
RxIoScheduler-5 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#33 
GC 
Raw Text 
dalvik.system.NativeStart.run (NativeStart.java) 
#34 
Queue 
Raw Text 
java.lang.Object.wait (Object.java) 
java.util.concurrent.PriorityBlockingQueue.take (PriorityBlockingQueue.java:510) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.performOperation (DependencyPriorityBlockingQueue.java:197) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.get (DependencyPriorityBlockingQueue.java:236) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take (DependencyPriorityBlockingQueue.java:65) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take (DependencyPriorityBlockingQueue.java:46) 
java.util.concurrent.ThreadPoolExecutor.getTask (ThreadPoolExecutor.java:1035) 
java.lang.Thread.run (Thread.java:841) 
#35 
AsyncTask #1 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#36 
LocationHandler 
Raw Text 
android.os.MessageQueue.nativePollOnce (MessageQueue.java) 
android.os.HandlerThread.run (HandlerThread.java:61) 
#37 
ReferenceQueueDaemon 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#38 
RxComputationScheduler-3 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#39 
Compiler 
Raw Text 
dalvik.system.NativeStart.run (NativeStart.java) 
#40 
TubeSockWriter-2 
Raw Text 
java.lang.Object.wait (Object.java) 
java.util.concurrent.LinkedBlockingQueue.take (LinkedBlockingQueue.java:410) 
com.firebase.tubesock.WebSocketWriter.writeMessage (WebSocketWriter.java:126) 
com.firebase.tubesock.WebSocketWriter.runWriter (WebSocketWriter.java:141) 
com.firebase.tubesock.WebSocketWriter.access$000 (WebSocketWriter.java:22) 
com.firebase.tubesock.WebSocketWriter$1.run (WebSocketWriter.java:36) 
java.lang.Thread.run (Thread.java:841) 
#41 
RxIoScheduler-6 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#42 
FinalizerDaemon 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#43 
Signal Catcher 
Raw Text 
dalvik.system.NativeStart.run (NativeStart.java) 
#44 
Binder_3 
Raw Text 
dalvik.system.NativeStart.run (NativeStart.java) 
#45 
RxIoScheduler-7 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#46 
Queue 
Raw Text 
java.lang.Object.wait (Object.java) 
java.util.concurrent.PriorityBlockingQueue.take (PriorityBlockingQueue.java:510) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.performOperation (DependencyPriorityBlockingQueue.java:197) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.get (DependencyPriorityBlockingQueue.java:236) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take (DependencyPriorityBlockingQueue.java:65) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take (DependencyPriorityBlockingQueue.java:46) 
java.util.concurrent.ThreadPoolExecutor.getTask (ThreadPoolExecutor.java:1035) 
java.lang.Thread.run (Thread.java:841) 
#47 
StethoListener-main 
Raw Text 
android.net.LocalSocketImpl.accept (LocalSocketImpl.java) 
android.net.LocalServerSocket.accept (LocalServerSocket.java:94) 
com.facebook.stetho.server.LocalSocketServer.listenOnAddress (LocalSocketServer.java:85) 
com.facebook.stetho.server.LocalSocketServer.run (LocalSocketServer.java:74) 
com.facebook.stetho.server.ServerManager$1.run (ServerManager.java:40) 
#48 
Answers Events Handler1 
Raw Text 
java.lang.Object.wait (Object.java) 
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587) 
io.fabric.sdk.android.services.common.ExecutorUtils$1$1.onRun (ExecutorUtils.java:75) 
io.fabric.sdk.android.services.common.BackgroundPriorityRunnable.run (BackgroundPriorityRunnable.java:30) 
java.lang.Thread.run (Thread.java:841) 
#49 
RxIoScheduler-4 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#50 
AsyncTask #4 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#51 
FinalizerWatchdogDaemon 
Raw Text 
java.lang.Object.wait (Object.java) 
java.lang.Thread.run (Thread.java:841) 
#52 
TubeSockReader-2 
Raw Text 
com.android.org.conscrypt.NativeCrypto.SSL_read (NativeCrypto.java) 
java.io.DataInputStream.readFully (DataInputStream.java:99) 
com.firebase.tubesock.WebSocketReceiver.read (WebSocketReceiver.java:141) 
com.firebase.tubesock.WebSocketReceiver.run (WebSocketReceiver.java:34) 
com.firebase.tubesock.WebSocket.runReader (WebSocket.java:372) 
com.firebase.tubesock.WebSocket.access$000 (WebSocket.java:30) 
com.firebase.tubesock.WebSocket$2.run (WebSocket.java:108) 
java.lang.Thread.run (Thread.java:841) 
#53 
Queue 
Raw Text 
java.lang.Object.wait (Object.java) 
java.util.concurrent.PriorityBlockingQueue.take (PriorityBlockingQueue.java:510) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.performOperation (DependencyPriorityBlockingQueue.java:197) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.get (DependencyPriorityBlockingQueue.java:236) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take (DependencyPriorityBlockingQueue.java:65) 
io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take (DependencyPriorityBlockingQueue.java:46) 
java.util.concurrent.ThreadPoolExecutor.getTask (ThreadPoolExecutor.java:1035) 
java.lang.Thread.run (Thread.java:841) 
+0

嘗試把'onBackPpressureDrop()''後電梯(...)'運營商。 –

+0

你能告訴我們'traceOnError'代碼嗎?正確編寫操作符是非常棘手的業務。 –

+0

剛剛編輯我的帖子。我已經添加了traceonerror代碼,它也從官方的rxjava git問題中獲得 –

回答

0

OperatorTraceOnError你暗中要求Long.MAX_VALUE從上游。通過從兒童用戶的請求,你需要使用Subscriber構造的不同過載:

@Override 
public Subscriber<? super T> call(Subscriber<? super T> child) { 
    Subscriber<T> parent = new Subscriber<T>(child) { 
     @Override 
     public void onCompleted() { 
      child.onCompleted(); 
     } 
... 
相關問題