无法使用 Retrofit2 + RxJava2 在回收站视图中获取数据
Unable to fetch data in recycler view using Retrofit2 + RxJava2
我正在使用 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() {
}
});
}
}
请有人告诉我数据不是什么问题displaying.Any将不胜感激。
谢谢
尝试实现以下方法而不是 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);
}
请检查下面link
https://www.learn2crack.com/2016/11/android-rxjava-2-and-retrofit.html
我猜您正试图从另一个线程使用回收器视图及其适配器进行操作。尝试在 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<BioData>)
方法。
希望对您有所帮助!
我正在使用 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() {
}
});
}
}
请有人告诉我数据不是什么问题displaying.Any将不胜感激。
谢谢
尝试实现以下方法而不是 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);
}
请检查下面link https://www.learn2crack.com/2016/11/android-rxjava-2-and-retrofit.html
我猜您正试图从另一个线程使用回收器视图及其适配器进行操作。尝试在 subscribeOn(Schedulers.io())
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<BioData>)
方法。
希望对您有所帮助!