Articles of retrofit

使用SqlBrite / SqlDelight(脱机数据库)和Retrofit(Http请求)的存储库模式

我正在使用SqlBrite / SqlDelight在RxJava中实现存储库模式以进行离线数据存储并为Http请求进行改造 这是一个样本: protected Observable<List> getItemsFromDb() { return database.createQuery(tableName(), selectAllStatement()) .mapToList(cursor -> selectAllMapper().map(cursor)); } public Observable<List>getItems(){ Observable<List> server = getRequest() .doOnNext(items -> { BriteDatabase.Transaction transaction = database.newTransaction(); for (Item item : items){ database.insert(tableName(), contentValues(item)); } transaction.markSuccessful(); transaction.end(); }) .flatMap(items -> getItemsFromDbById()) .delaySubscription(200, TimeUnit.MILLISECONDS); Observable<List> db = getItemsFromDbById(id) .filter(items -> items != null && items.size() […]

使用RxJava和Retrofit迭代列表并根据子查询扩充结果

我正在使用改造,我觉得rxjava(with retrolambda)非常适合以下流程: 获取小部件列表(http) 为每个小部件 a)获取给定窗口小部件types的文章列表(http) b)将所有这些保存到db c)获取列表中的第一篇(最新)文章,并使用本文中的适当值更新widget.articleName和widget.articleUrl 转换回列表并完成 但是我不确定在步骤2a之后该怎么做。 到目前为止,这是我的代码 apiService.getWidgets(token) .flatMapIterable(widgets -> widgets) .flatMap(widget -> apiService.getArticles(token, widget.type)) … .toList() .subscribe( modifiedWidgets -> saveWidgets(modifiedWidgets), throwable -> processWidgetError(throwable) ); 我玩过一些操作员,但是当链接时,我似乎总是缩小范围(例如,获取单个文章的句柄),然后再也无法访问原始小部件进行修改。 @GET(“/widgets”) Observable<List> getWidgets(@Header(“Authorization”) String token); @GET(“/articles”) Observable<List> getArticles(@Header(“Authorization”) String token, @Query(“type”) String type);

如何调试我的改装API调用?

我正在使用改造来从Flickr api获取一些数据。 我正在进行调用的方法如下所示: public static List getImageIds(int size) { Call call = flickrService.getPhotos(apiKey, format, “1”); Log.d(“TEMP_TAG”, “photo url: ” + call.request().url().toString()); photoIds = new ArrayList(); call.enqueue(new Callback(){ @Override public void onResponse(Call call, Response response) { Log.d(“TEMP_TAG”, “it’s getting here”); PhotosList photosList = response.body(); List photos = photosList.getPhotos().getPhoto(); for(Photo photo : photos) { Log.d(“TEMP_TAG”, “adding photo […]

RxJavaCallAdapterFactory无法转换为Factory

我正在尝试按照https://inthecheesefactory.com/blog/retrofit-2.0/en中的指南使用Retrofit 2和RxJava 在“与CallAdapter的RxJava集成”一节中解释了如何使用RxJava进行改造 Retrofit retrofit = new Retrofit.Builder() .baseUrl(“http://api.nuuneoi.com/base/”) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); 但是在编译期间会出现以下错误: Error:(63, 71) error: incompatible types: RxJavaCallAdapterFactory cannot be converted to Factory 我该如何解决? 谢谢

使用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 […]