2015-07-17 21 views
31

Tôi đang gặp lỗi IllegalStateException trong Thư viện Rx và không biết chính xác nơi gốc của vấn đề, cho dù đó là RxJava hay gì đó tôi có thể làm không chính xác.RxJava: Đã xảy ra lỗi khi cố gắng truyền lỗi tới Observer.onError

Sự cố gây tử vong xảy ra khi khóa chứng chỉ (xảy ra trên tất cả yêu cầu máy chủ) nhưng dường như chỉ đến thời gian chờ của phiên hoặc đăng xuất và quay lại. Lặp lại các bước (xảy ra khoảng 25% thời gian) như sau: danh sách mục - cuộn tất cả các cách kết thúc - đăng xuất - đăng nhập trong - ứng dụng mở - đóng ứng dụng -> Crash!

Bất kỳ ai có ý tưởng về cách ngăn chặn điều này? Tôi tìm thấy một vấn đề tương tự ở đây Observer.onError firing off inconsistently

java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread. 
    at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:62) 
    at android.os.Handler.handleCallback(Handler.java:615) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4867) 
    at java.lang.reflect.Method.invokeNative(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
    at dalvik.system.NativeStart.main(NativeStart.java) 
Caused by: rx.exceptions.OnErrorFailedException: Error occurred when trying to propagate error to Observer.onError 
    at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:201) 
    at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:111) 
    at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:159) 
    at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) 
    at android.os.Handler.handleCallback(Handler.java:615) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4867) 
    at java.lang.reflect.Method.invokeNative(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
    at dalvik.system.NativeStart.main(NativeStart.java) 
Caused by: rx.exceptions.CompositeException: 2 exceptions occurred. 
    at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:201) 
    at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:111) 
    at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:159) 
    at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) 
    at android.os.Handler.handleCallback(Handler.java:615) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4867) 
    at java.lang.reflect.Method.invokeNative(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
    at dalvik.system.NativeStart.main(NativeStart.java) 
Caused by: rx.exceptions.CompositeException$CompositeExceptionCausalChain: Chain of Causes for CompositeException In Order Received => 
    at com.crashlytics.android.SessionDataWriter.getEventAppExecutionExceptionSize(SessionDataWriter.java:597) 
    at com.crashlytics.android.SessionDataWriter.getEventAppExecutionExceptionSize(SessionDataWriter.java:600) 
    at com.crashlytics.android.SessionDataWriter.getEventAppExecutionExceptionSize(SessionDataWriter.java:600) 
    at com.crashlytics.android.SessionDataWriter.getEventAppExecutionSize(SessionDataWriter.java:533) 
    at com.crashlytics.android.SessionDataWriter.getEventAppSize(SessionDataWriter.java:492) 
    at com.crashlytics.android.CrashlyticsUncaughtExceptionHandler.writeSessionEvent(CrashlyticsUncaughtExceptionHandler.java:956) 
    at com.crashlytics.android.CrashlyticsUncaughtExceptionHandler.access$200(CrashlyticsUncaughtExceptionHandler.java:56) 
    at com.crashlytics.android.CrashlyticsUncaughtExceptionHandler$7.call(CrashlyticsUncaughtExceptionHandler.java:274) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
    at io.fabric.sdk.android.services.common.ExecutorUtils$1$1.onRun(ExecutorUtils.java:58) 
    at io.fabric.sdk.android.services.common.BackgroundPriorityRunnable.run(BackgroundPriorityRunnable.java:13) 
    at java.lang.Thread.run(Thread.java:856) 
+0

Xin chào Scott. Bất kỳ khả năng biết phiên bản Android, phiên bản RxJava, phiên bản RxAndroid, xin vui lòng? Bạn có đang xử lý đúng tất cả các đăng ký của mình không? –

+0

io.reactivex: rxandroid: 0.24.0 io.reactivex: rxjava: 1.0.12 'Android phiên bản 5.1' Và có, tôi hủy đăng ký tất cả các đăng ký của mình và sau đó giải quyết chúng thành số không –

+0

Bạn có thể thử RxAndroid 1.0.1https không : //github.com/ReactiveX/RxAndroid/releases/tag/v1.0.1 vui lòng? –

Trả lời

39

gì đang xảy ra là việc thực hiện onError của bạn trong một Subscriber được ném một ngoại lệ được kiểm soát mà là chống lại hợp đồng Quan sát và điều này hủy bỏ quá trình xử lý có thể quan sát ném một OnErrorFailedException trong observeOn Scheduler.

+0

Thật đáng để chỉ ra điều đó nếu bạn cố gắng gỡ lỗi điều này bằng cách đăng nhập bên trong triển khai 'onError' của bạn, bạn có thể không thấy nó trong logcat. Bạn đang gỡ lỗi tốt nhất với các điểm ngắt. Đây là những gì giữ cho tôi từ ban đầu nhìn thấy vấn đề. – tir38

+0

Làm thế nào tôi có thể theo dõi lỗi chính xác trong 'onError()' gọi lại thay vì nhận stacktrace chung này? – Lemberg

+0

Cách sửa lỗi này? –

10

Có thể bạn đang chuyển ngữ cảnh Hoạt động ở đâu đó từ cuộc gọi lại onError của mình. Điều này đã xảy ra với tôi khi tôi cố gắng hiển thị một AlertDialog - chuyển cho nó một ngữ cảnh Hoạt động cụ thể - và nhấn nút quay lại trước khi hộp thoại đó xuất hiện. Lời khuyên của tôi là không vượt qua các bối cảnh Hoạt động theo cách này.

+1

Điều này nghe có vẻ giống như một trường hợp rất cụ thể – carlosavoy

+0

@ CarloLópezScutaro Điều gì đang gây ra sự cố cho bạn? –

+0

Điều này đã xảy ra với tôi. Chính xác cùng một kịch bản. Bạn đã tạo ra hộp thoại như thế nào? Tôi đã tạo ra hộp thoại của tôi abstracted ra đến một lớp util vì vậy tôi cần phải vượt qua nó một bối cảnh để tạo ra AlertDialog. – Brandon

-1

nếu bạn muốn cập nhật giao diện người dùng trong onerror, chỉ cần thử:

api.subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber(){....}) 
0

Đây là cách tôi giải quyết vấn đề này:

public abstract class MyNetworkSubscriber<T> extends Subscriber<T> { 

@Override 
public void onCompleted() {} 

@Override 
public void onError(Throwable e) { 
    if (e instanceof HttpException) { 
     ResponseBody responseBody = ((HttpException) e).response().errorBody(); 
     try { 
      if (responseBody != null) { 
       MyError error = new Gson().fromJson(responseBody.string(), MyError.class); 
       onErrorCode(error); 
      } 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
    } else { 
     e.printStackTrace(); 
    } 
} 

public void onErrorCode(MyError error){}; 
} 

Đối với một số lý do, OkHttp đã buộc tôi phải bắt onerror vì vậy tôi đã làm. Nếu tôi không làm điều này, OkHttp/Retrofit sẽ bị lỗi và ứng dụng sẽ tắt.

Bằng cách cung cấp giải pháp này,

  1. bạn có thể chọn để ghi đè của riêng bạn onErrorCode và có được một đối tượng chi tiết hơn lại là lỗi mà xuất phát từ API của bạn nhưng bạn không cần phải.
  2. OnError bị ghi đè, không có nhiều sự cố điên rồ nữa.
  3. Và cuối cùng nhưng không kém phần quan trọng, nó vẫn là chung chung vì <T>!

Bạn cũng có thể buộc onComplete & onError để được overriden để làm cho các phương pháp trừu tượng.

Các vấn đề liên quan