Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android rxJava错误处理与改进_Java_Android_Error Handling_Retrofit_Rx Java - Fatal编程技术网

Android rxJava错误处理与改进

Android rxJava错误处理与改进,java,android,error-handling,retrofit,rx-java,Java,Android,Error Handling,Retrofit,Rx Java,我正在使用较新的RXJava,而不是 Observable.create(new Observable.OnSubscribeFunc<T>() {...}); 给定的api地址不是真实地址,但真实地址是可访问的。我刚刚关闭了WiFi以测试错误处理 还有一个用例:如果我添加到observable.OneExceptionResumeNext([Second observable])中,那么它将进入第二个observable,并且不会崩溃。但这并不是问题的解决办法 编辑2 ApiMa

我正在使用较新的RXJava,而不是

Observable.create(new Observable.OnSubscribeFunc<T>() {...});
给定的api地址不是真实地址,但真实地址是可访问的。我刚刚关闭了WiFi以测试错误处理

还有一个用例:如果我添加到observable.OneExceptionResumeNext([Second observable])中,那么它将进入第二个observable,并且不会崩溃。但这并不是问题的解决办法

编辑2

ApiManager.login(userName, pass, new Observer<User>() {
    @Override
    public void onCompleted() { }

    @Override
    public void onError(Throwable e) {
        DialogManager.showBasicErrorDialog(getApplicationContext(), e.getLocalizedMessage());
        logger.showLog("Login Not ok");
        e.printStackTrace();
    }

    @Override
    public void onNext(User user) {
        logger.showLog("login ok, user: " + user.getName().toString());
        {...}
    }

}); 
{…}


提前感谢您的帮助。

您不必通过改装构建自己的Observable,因为改装可以直接返回Observable:

改造还集成了RxJava,以支持返回类型的方法 可观测的

@获取(“/user/{id}/photo”)可观察的getUserPhoto(@Path(“id”) int id)

(您不必自己处理错误)


你能把你撞车的痕迹贴出来吗?正如我和您一样认为,您的应用程序不应该崩溃。

看起来您可能遇到了一个问题,该问题在RxJava 1.0中已得到修复:


您可以发布堆栈跟踪/logcat输出吗?调用代码是什么样子的(观察者定义)?它已被编辑。。但事实上这并不太相关,因为错误是故意的。。。看起来不会传播错误-因此看起来所有这些代码都按照预期/文档的方式工作,崩溃发生在这之后。如果我在OneError()中注释掉我使用Throwable e执行任何操作的行,那么一切都正常。它必须是DialogManager类,因此可能是另一个错误。。logcat没有在正确的位置显示..同意这一点-您粘贴的logcat输出肯定是改装日志,它有开始/结束行。谢谢,我刚刚学到了一些好东西,我修改了代码,就像您建议的那样,删除了所有可观察的内容,并修改了:可观察的getUser(@Field(“用户名”)字符串username,@Field(“密码”)字符串密码);但问题仍然存在。未处理错误,应用程序崩溃。我认为这不是改装的问题,而是RX的问题。并添加了stacktrace。顺便问一下,如果我想在将对象处理为可观察对象之前对其进行处理,该怎么办?-->就像这里,在登录时(用户名,密码)-->我想将“凭证”保存到用户对象中,最好只写一次,而不是应用程序中的所有登录位置。因此,在告诉LoginScreen发生了什么事情之前,这个可观察的可以像超级函数一样运行。我正在使用rxjava的android模块,现在jCenter上最新的是0.20.7依赖项:compile'com.netflix.rxjava:rxjava android:0.20.7'。的新版本有一个不同的标识符-compile'io.reactivex:rxandroid:0.24.0'。您还需要将RxJava核心模块升级到1.0。我认为这就是问题所在@AdamS我不知道你说的“你也需要将RxJava核心模块升级到1.0”是什么意思。顺便说一句,谢谢你的回答。我正在使用RxJava 1.1.0和RxAndroid 1.1.0,面临着同样的问题!
private interface ApiManagerService {

    @FormUrlEncoded
    @POST("/login")
    User getUser(@Field("username") String userName, @Field("password") String password);

}


private static RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint(HOST)
    .setLogLevel(RestAdapter.LogLevel.FULL)
    .build();

private static ApiManagerService apiManager = restAdapter.create(ApiManagerService.class);

public static Subscription login(final String userName, final String password, Observer<User> observer) {
    return Observable.create(new Observable.OnSubscribe<User>() {
        @Override
        public void call(Subscriber<? super User> subscriber) {
            try {

                User user = apiManager.getUser(userName, password);

                subscriber.onNext(user);
                subscriber.onCompleted();

            } catch (RetrofitError e) {
                subscriber.onError(e);
            } catch (Throwable e) {
                subscriber.onError(e);
            }
        }
    }

    ).subscribeOn(Schedulers.io())
     .retry(3)
     .observeOn(AndroidSchedulers.mainThread())
     .subscribe(observer);
}
    01-08 16:19:31.576  15285-16162/asd.bdef.gh D/Retrofit﹕ ---- ERROR https://testapi.com/api/login
    01-08 16:19:31.606  15285-16162/asd.bdef.gh D/Retrofit﹕ java.net.UnknownHostException: Unable to resolve host "testapi.com": No address associated with hostname
                at java.net.InetAddress.lookupHostByName(InetAddress.java:394)
                at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
                at java.net.InetAddress.getAllByName(InetAddress.java:214)
                at com.squareup.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
                at com.squareup.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:259)
                at com.squareup.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:233)
                at com.squareup.okhttp.internal.http.RouteSelector.nextUnconnected(RouteSelector.java:159)
                at com.squareup.okhttp.internal.http.RouteSelector.next(RouteSelector.java:133)
                at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:314)
                at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:237)
                at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:423)
                at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:105)
                at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:239)
                at com.squareup.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
                at com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:25)
                at retrofit.client.UrlConnectionClient.prepareRequest(UrlConnectionClient.java:68)
                at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:37)
                at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:321)
                at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
                at retrofit.RestAdapter$RestHandler$1.invoke(RestAdapter.java:265)
                at retrofit.RxSupport$2.run(RxSupport.java:55)
                at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390)
                at java.util.concurrent.FutureTask.run(FutureTask.java:234)
                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
                at retrofit.Platform$Android$2$1.run(Platform.java:142)
                at java.lang.Thread.run(Thread.java:841)
    01-08 16:19:31.606  15285-16162/asd.bdef.gh D/Retrofit﹕ ---- END ERROR
    01-08 16:19:31.977  15285-15285/asd.bdef.gh D/AndroidRuntime﹕ Shutting down VM
    01-08 16:19:31.977  15285-15285/asd.bdef.gh W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41c9d8b0)
    01-08 16:19:31.977  15285-15285/asd.bdef.gh E/AndroidRuntime﹕ FATAL EXCEPTION: main
ApiManager.login(userName, pass, new Observer<User>() {
    @Override
    public void onCompleted() { }

    @Override
    public void onError(Throwable e) {
        DialogManager.showBasicErrorDialog(getApplicationContext(), e.getLocalizedMessage());
        logger.showLog("Login Not ok");
        e.printStackTrace();
    }

    @Override
    public void onNext(User user) {
        logger.showLog("login ok, user: " + user.getName().toString());
        {...}
    }

}); 
FATAL EXCEPTION: main
rx.exceptions.OnErrorFailedException: Error occurred when trying to propagate error to Observer.onError
        at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:175)
        at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:97)
        at rx.internal.operators.NotificationLite.accept(NotificationLite.java:144)
Caused by: java.lang.NullPointerException: Attempt to read from field 'rx.functions.Action0 rx.schedulers.TrampolineScheduler$TimedAction.action' on a null object reference
        at rx.schedulers.TrampolineScheduler$InnerCurrentThreadScheduler.enqueue(TrampolineScheduler.java:85)