Android 无法使用Reformation2+;在回收器视图中获取数据;RxJava2

Android 无法使用Reformation2+;在回收器视图中获取数据;RxJava2,android,retrofit2,rx-java2,Android,Retrofit2,Rx Java2,我使用改型2发出网络请求我尝试使用RxJava实现从taht I的recycler视图中的服务器获取数据,但数据没有获取,尽管它在onNext()方法上显示日志消息 下面是我的代码: ApiService.java public interface ApiService { @POST("retrofitUsers") @FormUrlEncoded Observable<String> saveData(@Field("name") String name

我使用改型2发出网络请求我尝试使用RxJava实现从taht I的recycler视图中的服务器获取数据,但数据没有获取,尽管它在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();

}
BioData.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() {
    }
}
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;
    }
}
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() {

                }
            });
      }

}
Users.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() {
    }
}
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;
    }
}
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() {

                }
            });
      }

}
公共类用户扩展AppCompative活动{
回收查看回收;
用户适配器;
ProgressBar程序;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_用户);
prog=findviewbyd(R.id.prog);
回收=findViewById(R.id.recycle);
recycle.setHasFixedSize(true);
recycle.setLayoutManager(新的LinearLayoutManager(此));
fetchData();
}
私有void fetchData(){
Refundation-Refundation=RefundationClient.getInstance();
ApiService myApi=reformation.create(ApiService.class);
myApi.getData()
.TooObservable()文件
.subscribeOn(Schedulers.io())
.订阅(新观察员){
@凌驾
认购的公共无效(一次性d){
}
@凌驾
public void onNext(列出bioData){
如果(bioData.size()>0){
Log.d(“数据”,“你好”);
}
adapter=newuseradapter(bioData,getApplicationContext());
recycle.setAdapter(适配器);
}
@凌驾
公共无效申报人(可丢弃的e){
Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_SHORT).show();
}
@凌驾
未完成的公共空间(){
}
});
}
}
有人请让我知道什么问题,为什么数据不显示。任何帮助将不胜感激


谢谢

请尝试实现以下方法,而不是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);
}
private void loadJSON(){
RequestInterface RequestInterface=new reformation.Builder()
.baseUrl(基本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

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

另外,从
onNext()
中删除以下行:

adapter = new UserAdapter(bioData, getApplicationContext());
recycle.setAdapter(adapter);
请先初始化您的适配器(当您初始化回收器视图时),并传递内部适配器空列表,然后将此先前初始化的适配器设置为回收器视图。然后,在内部
onNext()
将从服务器获取的列表设置为适配器,并调用
适配器。notifyDataSetChanged()

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

adapter = new UserAdapter(new ArrayList<BioData>(), getApplicationContext());

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

recycle.setAdapter(adapter);
...
当然,您需要在
UserAdapter
中声明
setData(List)
方法


希望有帮助!

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