Android RxJava2 Retrofit and ViewPager



我正在使用RxJava2和Retrofit with ViewPager,我遇到了这个错误io.reactivex.exceptions.OnErrorNotImplementException: 预期BEGIN_ARRAY,但在第 1 行第 2 列路径 $ 处BEGIN_OBJECT

我在下面的代码 波乔类

public class Photo {
private String name;
private String imageUrl;
public Photo() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
}

接口

public interface inNetworkManager {
Observable<Photo[]> loadPhotos();

}

public interface inServices {
@GET("heroes.php")
Observable<Photo[]> loadPhotos();
}

网络管理器类

公共类 NetworkManager 在 NetworkManager 中实现 { 私人服务;

public NetworkManager() {
initData();
}
private void initData() {
OkHttpClient client = new OkHttpClient.Builder()
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(CommonsKt.getBASE_URL())
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
services = retrofit.create(inServices.class);
}
@Override
public Observable<Photo[]> loadPhotos() {
return services.loadPhotos()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}

}适配器

public class QuetoPhotoPageAdapter extensions PagerAdapter {

private ArrayList<Photo> list;
private LayoutInflater inflater;
private Context context;
private AppCompatImageView imQueto;
public QuetoPhotoPageAdapter(ArrayList arrayList, Context context) {
this.list = arrayList;
this.context = context;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return list.size();
}
public void addPhotos(Photo[] photos) {
list.clear();
notifyDataSetChanged();
Collections.addAll(list, photos);
notifyDataSetChanged();
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
View view = inflater.inflate(R.layout.item_view, container, false);
imQueto = view.findViewById(R.id.imQuote);
Picasso.get()
.load(String.valueOf(list.get(position)))
.into(imQueto);
container.addView(view, 0);
return view;
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view.equals(object);
}

}

主活动

public class MainActivity extends BaseActivity {
private ArrayList<Photo> list;
private QuetoPhotoPageAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addNet();
init();
}
/*new Consumer<Photo[]>() {
@Override
public void accept(Photo[] photos) throws Exception {
adapter.addPhotos(photos);
}
}*/
private void addNet() {
inNetworkManager manger = ((App) getApplication()).getManager();
Disposable d = manger.loadPhotos()
.subscribe(photos -> adapter.addPhotos(photos));
addDispose(d);
}
private void init() {
adapter = new QuetoPhotoPageAdapter(list, MainActivity.this);
}

此错误主要发生在 Pojo 中不匹配时,Pojo 是一个对象,但您的 JSON 格式是数组。首先创建一个pojo,同时将给出照片列表

package com.example;
import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Example {
@SerializedName("heroes")
@Expose
private List<Hero> heroes = null;
public List<Hero> getHeroes() {
return heroes;
}
public void setHeroes(List<Hero> heroes) {
this.heroes = heroes;
}
}

在此之后

package com.example;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Hero {
@SerializedName("name")
@Expose
private String name;
@SerializedName("imageurl")
@Expose
private String imageurl;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImageurl() {
return imageurl;
}
public void setImageurl(String imageurl) {
this.imageurl = imageurl;
}
}
And 

public interface inServices {
@GET("heroes.php")
Observable<Example> loadHeroes();
}

由于你的JSON,你不应该把你的Pojo

弄得很厉害
public class Hero {
@SerializedName("name")
@Expose
private String name;
@SerializedName("imageurl")
@Expose
private String imageurl;
}
public class HeroResponse {
@SerializedName("heroes")
@Expose
private ArrayList<Hero> heroes = new ArrayList<>();
}

所以你的间歇会看起来像这样

public interface inServices {
@GET("heroes.php")
Observable<HeroResponse> loadHeroes();
}

最新更新