首页 > 解决方案 > Android RxJava2 改造和 ViewPager

问题描述

我在 ViewPager 中使用 RxJava2 和 Retrofit,我遇到了这个错误 io.reactivex.exceptions.OnErrorNotImplementedException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

我在 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 实现 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);
}

}

主要活动

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);
    }

标签: androidretrofit

解决方案


此错误主要发生在作为对象的 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();
}

推荐阅读