【发布时间】:2018-07-10 20:08:20
【问题描述】:
我正在使用 RxJava2 和 Retrofit 和 ViewPager,我遇到了这个错误 io.reactivex.exceptions.OnErrorNotImplementedException:应为 BEGIN_ARRAY,但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT
我的代码如下 Pojo类
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 实现 inNetworkManager { 私人 inServices 服务;
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());
}
} 适配器
公共类 QuetoPhotoPageAdapter 扩展 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);
}
}
MainActivity
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);
}
【问题讨论】:
-
你从你的服务器获取对象,而不是数组
-
我该怎么办?
-
你应该把
@GET("heroes.php") Observable<Photo[]> loadPhotos();改成@GET("heroes.php") Observable<Photo> loadPhoto(); -
另外,最好只显示你的 pojo、界面和 JSON,这样我就可以清除我的答案