【问题标题】:Unable to fetch data in recycler view using Retrofit2 + RxJava2无法使用 Retrofit2 + RxJava2 在回收器视图中获取数据
【发布时间】:2019-07-18 00:15:39
【问题描述】:

我正在使用retrofit2 发出网络请求我正在尝试在回收器视图中从服务器获取数据,以便我使用RxJava 实现,但数据未获取,尽管它在onNext() 方法上显示日志消息。

下面是我的代码:

ApiService.java

public interface ApiService {

    @POST("retrofitUsers")
    @FormUrlEncoded
    Observable<String> saveData(@Field("name") String name,
                             @Field("age") String age)

    @GET("getUsers")
    Flowable<List<BioData>> getData();

}

RetrofitClient.java

public class RetrofitClient {

    private static Retrofit retrofit = null;

    public static Retrofit getInstance() {
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .connectTimeout(22,TimeUnit.SECONDS)
            .readTimeout(22, TimeUnit.SECONDS)
            .connectTimeout(22, TimeUnit.SECONDS)
            .build();

        if(retrofit == null)
            retrofit = new Retrofit.Builder()
                .baseUrl("https://example.com/")
                .addConverterFactory(
                    GsonConverterFactory
                        .create(
                            new GsonBuilder().setLenient().create()
                        )
                )
                .addCallAdapterFactory(
                    RxJava2CallAdapterFactory.create()
                )
                .client(okHttpClient)
                .build();

        return retrofit;
    }

    private RetrofitClient() {
    }
}

BioData.java

public class BioData {

    @SerializedName("name")
    @Expose
    private String name;

    @SerializedName("age")
    @Expose
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

Users.java

public class Users extends AppCompatActivity {

    RecyclerView recycle;
    UserAdapter adapter;
    ProgressBar prog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_users);

        prog = findViewById(R.id.prog);

        recycle = findViewById(R.id.recycle);
        recycle.setHasFixedSize(true);
        recycle.setLayoutManager(new LinearLayoutManager(this));

        fetchData();
     }

     private void fetchData() {

         Retrofit retrofit  = RetrofitClient.getInstance();
         ApiService myApi = retrofit.create(ApiService.class);

         myApi.getData()
             .toObservable()
             .subscribeOn(Schedulers.io())
             .subscribe(new Observer<List<BioData>>() {

                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(List<BioData> bioData) {

                    if(bioData.size() > 0){
                        Log.d("Data","Hello");
                    }
                    adapter = new UserAdapter(bioData,getApplicationContext());
                    recycle.setAdapter(adapter);
                }

                @Override
                public void onError(Throwable e) {

                    Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onComplete() {

                }
            });
      }

}

有人请告诉我数据不显示的问题。任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: android retrofit2 rx-java2


    【解决方案1】:

    我猜你正试图从另一个线程使用回收器视图及其适配器进行操作。只需尝试在 subscribeOn(Schedulers.io()) 之后的 Rx 链中添加方法 observeOn(AndroidSchedulers.mainThread())

    另外,从onNext() 中删除这些行:

    adapter = new UserAdapter(bioData, getApplicationContext());
    recycle.setAdapter(adapter);
    

    请早点初始化您的适配器(当您初始化回收站视图时)并传入适配器空列表,然后将此先前初始化的适配器设置为回收站视图。然后,在onNext() 中设置从服务器获取的列表到适配器并调用adapter.notifyDataSetChanged()

    您可以在下面看到的代码示例:

    adapter = new UserAdapter(new ArrayList<BioData>(), getApplicationContext());
    
    recycle = findViewById(R.id.recycle);
    recycle.setHasFixedSize(true);
    recycle.setLayoutManager(new LinearLayoutManager(this));
    
    recycle.setAdapter(adapter);
    ...
    

    然后onNext():

    if(bioData.size() > 0){
        Log.d("Data","Hello");
    }
    adapter.setData(bioData, getApplicationContext());
    adapter.notifyDataSetChanged();
    

    当然,您需要在UserAdapter 中声明setData(List&lt;BioData&gt;) 方法。

    希望对你有帮助!

    【讨论】:

    • 谢谢,兄弟现在工作正常,实际上我忘了添加observeOn()方法。
    • @Digvijay 不客气!如果有帮助,请将其标记为答案
    【解决方案2】:

    代替OnNext,尝试实现下面的方法

    private void loadJSON() {
    
        RequestInterface requestInterface = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build().create(RequestInterface.class);
    
        mCompositeDisposable.add(requestInterface.register()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(this::handleResponse,this::handleError));
    }
    
    private void handleResponse(List<Android> androidList) {
    
        mAndroidArrayList = new ArrayList<>(androidList);
        mAdapter = new DataAdapter(mAndroidArrayList);
        mRecyclerView.setAdapter(mAdapter);
    }
    

    请查看以下链接 https://www.learn2crack.com/2016/11/android-rxjava-2-and-retrofit.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多