Java 无法更新用户界面

Java 无法更新用户界面,java,android,observable,rx-java,Java,Android,Observable,Rx Java,我正在为完成一个服务电话干杯。但是,在onComplete方法中,我收到此异常: java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序 它是从SafeSubscriber#onNext(T args)抛出的,如下所示: /** * Provides the Subscriber with a new item to observe. * <p> * The {@code Observabl

我正在为完成一个服务电话干杯。但是,在onComplete方法中,我收到此异常:

java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序

它是从
SafeSubscriber#onNext(T args)
抛出的,如下所示:

/**
     * Provides the Subscriber with a new item to observe.
     * <p>
     * The {@code Observable} may call this method 0 or more times.
     * <p>
     * The {@code Observable} will not call this method again after it calls either {@link #onCompleted} or
     * {@link #onError}.
     * 
     * @param args
     *          the item emitted by the Observable
     */
    @Override
    public void onNext(T args) {
        try {
            if (!done) {
                actual.onNext(args);
            }
        } catch (Throwable e) {
            // we handle here instead of another method so we don't add stacks to the frame
            // which can prevent it from being able to handle StackOverflow
            Exceptions.throwIfFatal(e);
            // handle errors if the onNext implementation fails, not just if the Observable fails
            onError(e);
        }
    }
/**
*向订阅者提供一个要观察的新项目。
*
*{@code Observable}可以调用此方法0次或多次。
*
*{@code Observable}在调用{@link#onCompleted}或{@code Observable}之后,将不会再次调用此方法
*{@link#onError}。
* 
*@param args
*可见光发射的物体
*/
@凌驾
public void onNext(T参数){
试一试{
如果(!完成){
实际值.onNext(args);
}
}捕获(可丢弃的e){
//我们在这里处理,而不是另一个方法,所以我们不向框架添加堆栈
//这可以防止它处理堆栈溢出
例外情况。throwIfFatal(e);
//在onNext实现失败时处理错误,而不仅仅是在Observable失败时
onError(e);
}
}
这是我的代码中出现问题的代码片段:

 NetworkService.aService()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread()) 
                    .flatmap(anotherCall)
                    .subscribe(new Subscriber<AddCommentResponse>() {
                @Override
                public void onCompleted() {
                    Toast.makeText(...).show();
                    navigateBack();
                }

                // etc. ...
NetworkService.aService()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatmap(另一个调用)
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
Toast.makeText(…).show();
导航返回();
}
//等等。。。

问题是我无法从onCompleted方法更新UI?或者我应该在哪里处理UI操作?

NetworkService位于工作线程上。您正在从工作线程调用makeText(..),该线程应从UI线程调用。请尝试创建一个处理程序,并从其内部烘烤

ActivityContext.runOnUiThread(new Runnable() { 
  public void run() { 
Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show();
  } 
}); 

可能是另一个线程上的
另一个调用
观察。在
flatMap
调用之后移动
观察(在android主线程上)。

最初:

NetworkService.aService()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread()) 
                    .flatmap(anotherCall)
此更改后,它正在工作:

NetworkService.aService()
                    .flatmap(anotherCall)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread()) 

所以,也许我应该切换#subscribeOn()和#observeOn()?-->这不起作用。我只是在尝试你的建议。即使它起作用,为什么我要比state#observeOn(AndroidSchedulers.mainThread()更有效???所以它是有效的。但是没有更好的解决方案吗?我会接受答案谢谢,但是如果有人能提供更好的答案,我会接受。