- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
好的,我们实现了一个 MVP 层,很好地展示并使用 RxJava 和 RxAndroid。我们拍了this作为例子并以此为基础。
当 Presenter 被调用开始执行时,它会向 Model Interactor 提交一个 Subscriber
。 Interactor 创建一个 Observable
并设置 observeOn(Schedulers.io())
和 subscribeOn(AndroidSchedulers.mainThread())
。这样(我们认为)当调用返回到 Subscriber
(在 Presenter 中)时,每个调用都将在 UI 线程上进行。在 Subscriber
中,我们将数据绑定(bind)到 View 。但是,这会引发 CalledFromWrongThreadException
:
07-28 09:12:48.844 17424 17566 AndroidRuntime E FATAL EXCEPTION: RxCachedThreadScheduler-1
07-28 09:12:48.844 17424 17566 AndroidRuntime E Process: [PACKAGE NAME], PID: 17424
07-28 09:12:48.844 17424 17566 AndroidRuntime E java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:62)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at java.util.concurrent.FutureTask.run(FutureTask.java:237)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at java.lang.Thread.run(Thread.java:818)
07-28 09:12:48.844 17424 17566 AndroidRuntime E Caused by: rx.exceptions.OnErrorFailedException: Error occurred when trying to propagate error to Observer.onError
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:201)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:111)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:137)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.internal.operators.OperatorSubscribeOn$1$1$1.onNext(OperatorSubscribeOn.java:76)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.internal.operators.NotificationLite.accept(NotificationLite.java:150)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:205)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:159)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
07-28 09:12:48.844 17424 17566 AndroidRuntime E ... 7 more
07-28 09:12:48.844 17424 17566 AndroidRuntime E Caused by: rx.exceptions.CompositeException: 2 exceptions occurred.
07-28 09:12:48.844 17424 17566 AndroidRuntime E ... 15 more
07-28 09:12:48.844 17424 17566 AndroidRuntime E Caused by: rx.exceptions.CompositeException$CompositeExceptionCausalChain: Chain of Causes for CompositeException In Order Received =>
07-28 09:12:48.844 17424 17566 AndroidRuntime E at android.util.Log.getStackTraceString(Log.java:499)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at com.android.internal.os.RuntimeInit.Clog_e(RuntimeInit.java:59)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at com.android.internal.os.RuntimeInit.access$200(RuntimeInit.java:43)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:91)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:66)
07-28 09:12:48.844 17424 17566 AndroidRuntime E ... 7 more
07-28 09:12:48.844 17424 17566 AndroidRuntime E Caused by: java.lang.IllegalStateException: Method call should happen from the main thread.
07-28 09:12:48.844 17424 17566 AndroidRuntime E at com.squareup.picasso.Utils.checkMain(Utils.java:136)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at com.squareup.picasso.RequestCreator.into(RequestCreator.java:615)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at com.squareup.picasso.RequestCreator.into(RequestCreator.java:601)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at com.nextmarkets.next.education.view.TradingIdeaHistoryFragment.setCoachAvatar(TradingIdeaHistoryFragment.java:94)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at com.nextmarkets.next.education.TradingIdeaHistoryPresenter$TradingIdeaHistorySubscriber.onNext(TradingIdeaHistoryPresenter.java:55)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at com.nextmarkets.next.education.TradingIdeaHistoryPresenter$TradingIdeaHistorySubscriber.onNext(TradingIdeaHistoryPresenter.java:38)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:130)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.internal.operators.OperatorSubscribeOn$1$1$1.onNext(OperatorSubscribeOn.java:76)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.internal.operators.NotificationLite.accept(NotificationLite.java:150)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:205)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:159)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
07-28 09:12:48.844 17424 17566 AndroidRuntime E ... 7 more
07-28 09:12:48.844 17424 17566 AndroidRuntime E Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-28 09:12:48.844 17424 17566 AndroidRuntime E at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7062)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at android.view.ViewRootImpl.requestChildFocus(ViewRootImpl.java:3098)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at android.view.ViewGroup.requestChildFocus(ViewGroup.java:678)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at android.view.ViewGroup.requestChildFocus(ViewGroup.java:678)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at android.view.ViewGroup.requestChildFocus(ViewGroup.java:678)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at android.view.ViewGroup.requestChildFocus(ViewGroup.java:678)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at andro
堆栈跟踪实际上在此时中断。
当然,我们可以在 View 中手动在 UI 线程上运行它,但是当我们设置 subscribeOn(AndroidSchedulers.mainThread())
时,这不是必需的,不是吗?我们之前已经毫无问题地做到了这一点。我们是否遗漏了什么?
一些更多的实现细节:我们将 Dagger2 用于 DI,Interactor 在 Module
中创建,并通过构造函数获取 Schedulers。
@Provides
MyInteractor provideMyInteractor() {
return new MyInteractorImpl(Schedulers.io(), AndroidSchedulers.mainThread());
}
Presenter通过构造函数注入(inject)获取Interactor,Presenter通过Component
注入(inject)View。
最佳答案
不确定你在那里做什么,但只是提醒和澄清:
subscribeOn 方法指定执行 onSubscribe 方法的线程。
observeOn 方法指定将在其上执行 onNext/onError/onCompleted 的线程。
你是说 - “Interactor 创建一个 Observable 并设置 observeOn(Schedulers.io()) 和 subscribeOn(AndroidSchedulers.mainThread())。”您可能混淆了这两种方法。
关于android - CalledFromWrongThreadException 即使使用 AndroidSchedulers.mainThread(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31670286/
我已经看到很多关于这个主题的问题,但我对任何答案都不满意。 我希望它有一个 class ConnectionController implements Runnable 负责打开到服务器的连接,读取和
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCon
当我按下按钮时,我不断收到 CalledFromWringThreadException。 我的程序是这样的: public class MainActivity extends Activity i
我正在创建一款使用 Sphero 机器人球的游戏。当游戏开始/恢复时,它会检查配对或连接的球。如果蓝牙关闭,或者没有配对球,它会隐藏连接窗口。如果有配对但未连接的球,则转到此功能。 // If the
我们从 Crashlytics 收到错误报告,影响了相当一部分用户(大约 10%)。这是一个 CalledFromWrongThreadException。 问题是我不知道是什么导致了这个问题,我自己
我有一个 Activity 启动然后创建一个新的 NetworkHandler 实例,在 NetworkHandler 中我在一个新线程上运行它,这样 UI 线程就不会被卡住。 NetworkHand
我在 ListView 中显示了网页下载百分比的进度条。 for(int i=0;i { int id; public UploadTask(int id) {
我有一个 IntentService 可以像这样更新偏好: SharedPreferences.Editor editor = userPrefs.edit(); editor.putInt("COU
我正在尝试使用 Kotlin 协程在后台运行一些繁重的工作。 但是我收到了这个错误信息, 'android.view.ViewRootImpl$CalledFromWrongThreadExcepti
我有一种感觉是我的计时器导致了这次崩溃。奇怪的是我似乎无法在模拟器中重现它,但我的 Play 控制台崩溃报告告诉我用户不断遇到此崩溃: android.view.ViewRootImpl$Called
我使用的是 this , 显示来自互联网的图像,但它会引发如下错误: 04-12 13:45:05.337: E/AndroidRuntime(27897): Caused by: android.v
我的 logcat 中出现错误,指出: java.net.UnknownHostException: apps.example.com 09-13 14:57:28.970: W/System.err
我是 Android 初学者,所以如果这是一个愚蠢的问题,请友善。 我正在尝试动态更新四个 TextView。每当我尝试更新它们时,程序就会崩溃。 我不明白“只有创建 View 层次结构的原始线程才能
我在编写的应用程序中遇到一个非常奇怪的问题。这可能很简单,我对服务、AsyncTasks 以及何时可以再次访问 UI 线程有一些误解。 该应用程序包含一个主要 Activity ,您可以通过该 Act
我正在按照 android 教程构建天气应用程序,但是当我尝试将 mTemperature TextView 设置为我从预测 API 获得的温度时,我收到此错误“android.view.ViewRo
我在做 Espresso 测试时出错 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original threa
我已经创建了一个可以从 Activity 中的任何地方访问的 Handler,并且还编写了一个方法来更轻松地调用处理程序: private Handler textFromBGThread = new
我正在为一个 Android 应用开发一个测试类,我收到了一个 android.view.ViewRootImpl$CalledFromWrongThreadException。该代码假设模拟输入到文
我正在使用 OpenCV 库实现一个应用程序。处理完相机的 inputFrame 后,我想更新我的 TextView。但是,我收到以下错误: 08-01 17:01:45.085: E/Android
我不确定我的低估是否正确,因为我没有得到预期的输出。我有一个类,我在其中调用一个应该启动线程的方法。 public class MainActivity extends Activity { prot
我是一名优秀的程序员,十分优秀!