Articles of retrofit

使用Retrofit rxjava concatWith时堆栈溢出

我想使用rxjava Observable处理Retrofit中的分页。 我听从了另一个问题的建议。 我有超过100个需要获取的页面,但链在第20页左右失败并停止使用logcat中的以下日志进一步订阅observable 04-04 04:12:11.766 2951-3012/com.example.app I/dalvikvm﹕ threadid=28: stack overflow on call to Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;.compareAndSet:ZLJJ 04-04 04:12:11.766 2951-3012/com.example.app I/dalvikvm﹕ method requires 56+20+32=108 bytes, fp is 0x94b52350 (80 left) 04-04 04:12:11.766 2951-3012/com.example.app I/dalvikvm﹕ expanding stack end (0x94b52300 to 0x94b52000) 04-04 04:12:11.766 2951-3012/com.example.app I/dalvikvm﹕ Shrank stack (to 0x94b52300, curFrame is 0x94b548dc) 有人知道为什么会这样吗? 更新:我知道这是由于递归而发生的,但是有更优雅的方式来处理改装和rxjava的分页吗?

为什么在Android上使用Retrofit的RxJava doOnError()不起作用,但是Subscriber onError会起作用

谁能解释我为什么这样的代码: networApi.getList() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .doOnError(throwable -> { throwable.getMessage(); }) .doOnNext(list -> { coursesView.populateRecyclerView(list); courseList = (List) courses; }).subscribe(); 如果没有互联网进入doOnError,但会进一步抛出,以便应用程序关闭,但代码如下: networkApi.getList() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<List>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { e.getMessage(); } @Override public void onNext(List list) { coursesView.populateRecyclerView(list); courseList = (List) list; } }); 按照我的预期工作,这意味着当没有互联网连接时,它什么都不做 欢呼Wojtek

RxJava在活动恢复后重新订阅事件

我还在弄清楚RxJava并使用它与Retrofit 2做一些网络工作。我们已经尝试了几天了,而且现在代码看起来更具可读性但遇到了一个我似乎无法想象的问题周围。 我正在尝试执行登录(返回API令牌),然后使用此令牌获取同一链中的所有初始数据,以便链的输出是令牌+数据。 要做到这一点,我用API调用我的API服务 apiClient .login() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .flatMap(token -> getData(token)) .subscribe(new Subscrber() {…}); 这看起来很好,但我也希望在启动和停止链条时显示进度条。 所以我也添加了一个.doOnSubscribe()和一个.doOnUnsubscribe() 。 但是我注意到在更改方向后,我试图隐藏进度条的片段始终为null。 所以我搜索并遇到了RxLifecycle lib,看起来它会有所帮助,我现在.cache()并取消订阅事件链。 但我不知道如何在此之后再次在onCreate()订阅同一事件? 我想我错过了一些非常基本的东西,并希望得到任何帮助。

与PC相比,为什么Android中的响应时间(Rest Call)响应速度较慢?

我正在从Android设备进行restapi调用,并且与PC相比,看到速度的差异真的很惊讶。 下面是PC上rest工具的图像。 我尝试了很少的库,比如Retrofit,Volley以及常规的异步任务,以便从Android设备进行相同的rest调用,并注意到响应时间。 (Response times with Retrofit library (Time includes converting json data to java objects)). Test 1: 8372 Ms Test 2: 7715 Ms Test 3: 7686 Ms Test 4: 10128 Ms Test 5: 7876 Ms (Response times with Volley. No conversion to Java Objects from Json Data ) Test 1: 6721 MS Test 2: […]

改造2.0 + RxJava +错误JSON正文

我是RxJava和Retrofit的新手,我正在尝试用它来编写我的API调用。 所有API调用都返回错误的JSON主体,其格式为, {“errors”:[{“code”:100, “message”:”Login/Password not valid”, “arguments”:null}]} 目前我的登录API调用代码(其他也类似)是, mConnect.login(id, password) .subscribe(new Subscriber() { @Override public void onCompleted() { Log.d(TAG, “onCompleted()”); } @Override public void onError(Throwable e) { Log.e(TAG, “onError(): ” + e); if (e instanceof HttpException) { // dump e.response().errorBody() } } @Override public void onNext(Token token) { Log.d(TAG, “onNext(): ” + token); } }); […]

使用Retrofit observable处理网络错误

使用Obtrables with Retrofit时如何处理网络故障? 鉴于此代码: Observable observable = api.getApiService().getMyData(); observable .doOnNext(new Action1() { @Override public void call(GetJobResponse getJobResponse) { //do stuff with my data } }) .doOnError(new Action1() { @Override public void call(Throwable throwable) { //do stuff with error message } }); 如果没有网络,请求就会失败,并且不会调用onError。 它不会崩溃,但会无声地失败。 日志显示Retrofit获取错误: java.net.UnknownHostException: Unable to resolve host “api-staging.sittercity.com”: No address associated with hostname […]

使用RxJava和Retrofit的定期HTTP请求

是否可以使用RxJava / RxAndroid和Retrofit执行定期的http请求,每x秒更新一次数据? 目前我正在使用一个每x秒触发的IntentService和Recursive Handler / Runnable。 我想知道我是否可以删除所有这些并让RxJava处理请求。 final RestClient client = new RestClient(); final ApiService service = client.getApiService(); public interface ApiService { @GET(“/athletes”) public Observable<List> getAthletes(); } service.getAthletes() .retry(3) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<List>() { @Override public void call(List athletes) { // Handle Success } }, new Action1() { @Override public void call(Throwable throwable) { […]

当使用Retrofit 2.0 Observables时出现错误,如何获取Response body

我正在使用Retrofit 2.0来进行返回Observables的api调用。 当呼叫完成并且响应符合预期时,一切正常。 现在假设我们有一个错误响应,它会抛出一个onError。 我想阅读响应正文,即使它是一个错误。 例 @FormUrlEncoded @POST(“tokenLogin”) Observable loginWithToken( @Field(“token”) String pin ); 当请求和响应有效时,我得到正确的observable,并在出现错误时按预期调用onError。 正确回应: { “status” : “authenticated” } Observable将其转换为正确的Observable,我可以将响应读作LoginResponse对象。 现在,错误响应如下: { “errorMessage” : “You need to take some xyz action” } 我想阅读该错误响应并将消息显示给用户。 我该怎么做呢?

改造2:从响应机构获取JSON

我想使用改装2从我的api获取字符串json,使用改装1获取此json时我没有问题,但使用retrofit 2为我返回null 。 这就是我的json的样子 {“id”:1,”Username”:”admin”,”Level”:”Administrator”} 这是我的API @FormUrlEncoded @POST(“/api/level”) Call checkLevel(@Field(“id”) int id); 这就是我的代码的样子 Retrofit retrofit = new Retrofit.Builder() .baseUrl(Config.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); Api api = retrofit.create(Api.class); Call call = api.checkLevel(1); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { JsonObject post = new JsonObject().get(response.body().toString()).getAsJsonObject(); if (post.get(“Level”).getAsString().contains(“Administrator”)) { } } @Override public void onFailure(Call call, […]

链式两个改装可观察物与RxJava

我想一个接一个地执行2个网络呼叫。 两个网络调用都返回Observable。 第二次呼叫使用来自第一次呼叫的成功结果的数据,第二次呼叫的成功结果中的方法使用来自第一次和第二次呼叫的成功结果的数据。 此外,我应该能够以不同的方式处理onError“事件”。 我怎样才能避免回调地狱,如下例所示: API().auth(email, password) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1() { @Override public void call(final AuthResponse authResponse) { API().getUser(authResponse.getAccessToken()) .subscribe(new Action1<List>() { @Override public void call(List users) { doSomething(authResponse, users); } }, new Action1() { @Override public void call(Throwable throwable) { onErrorGetUser(); } }); } }, new Action1() { @Override public void call(Throwable throwable) […]