如何使用 rxjava/retrofit 正确等待/观察来自服务器的传入数据

Posted

技术标签:

【中文标题】如何使用 rxjava/retrofit 正确等待/观察来自服务器的传入数据【英文标题】:How to wait/observe incoming data from server correctly with rxjava/retrofit 【发布时间】:2021-02-04 19:44:40 【问题描述】:

我在从服务器下载数据时遇到问题,更具体地说,我无法实现“等待/观察传入数据”行为。我想用来自服务器的列表填充我的RecyclerViewSpinner,但是知道,这些方法返回空/空列表。我明白了,问题是方法在数据到达之前完成。

我检查了这两个相似的问题,但没有一个答案对我有用:

Waiting for API Calls to complete with RxJava and Retrofit

RXJava retrofit waiting having the UI wait for data to be fetched from API

我的代码:

API:

@GET("/api/categories")
Observable<Response<JsonObject>> getCategories();

网络工作者:

public List<String> getCat() 
    List<String> incomingDataSet = new ArrayList<>();
    
    compositeDisposable.add(
        apiConnector.getCategories()
            .subscribeOn(Schedulers.io())
            .observeOn(androidSchedulers.mainThread())
            .subscribe(response -> 
                if (response.code() >= 200 && response.code() < 300) 
                    JsonArray incomingArray = response.body().getAsJsonArray("category");
                    
                    for (int i = 0; i < incomingArray.size(); i++) 
                        incomingDataSet.add(incomingArray.get(i).getAsJsonObject().get("categoryname").toString().replaceAll("\"", ""));
                        Log.i("LOG", "downloadCategories response: " + incomingDataSet.toString());
                    

                 else 
                    Log.i("LOG", "Response error: " + response.code());
                
            )
    );

    Log.i("LOG", "getCat: " + incomingDataSet.toString());
    
    return incomingDataSet;

主活动:

List<String> categorylist = new ArrayList<>();
categorylist = netWorker.getCat();
Log.i("LOG", "list:" + categorylist );

那么,我在日志中看到的:

第一:

getCat: []

列表:[]

然后:

downloadCategories 响应:[cat1]

downloadCategories 响应:[cat1, cat2]

downloadCategories 响应:[cat1, cat2, cat3]

【问题讨论】:

【参考方案1】:

doOnSubscribe() 中显示微调器并在 doFinally() 中隐藏。将填充 RecyclerView 的代码放入 subscribe() 中,以便在数据到达时填充它。否则,您只会在主线程上获得空的新列表,并且不会进一步更新 RecyclerView

【讨论】:

以上是关于如何使用 rxjava/retrofit 正确等待/观察来自服务器的传入数据的主要内容,如果未能解决你的问题,请参考以下文章

RxJava/Retrofit - 如何强制用户使用特定的订阅者子类?

RxJava+Retrofit+OkHttp深入浅出-mvp(使用篇)

RxJava + Retrofit完成网络请求

RxJava + Retrofit 的实际应用场景

retrofit+RXjava二次封装

Android实战——RxJava2+Retrofit+RxBinding解锁各种新姿势