【问题标题】:Android RxJava2 Retrofit and ViewPagerAndroid RxJava2 改造和 ViewPager
【发布时间】: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&lt;Photo[]&gt; loadPhotos();改成@GET("heroes.php") Observable&lt;Photo&gt; loadPhoto();
  • 另外,最好只显示你的 pojo、界面和 JSON,这样我就可以清除我的答案
  • 我刚刚回答了herethis的可能重复问题。

标签: android retrofit


【解决方案1】:

这个错误主要发生在 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();
}

【讨论】:

  • {"heroes":[{"name":"Spiderman","imageurl":"https:\/\/simplifiedcoding.net\/demos\/view-flipper\/images\/spiderman.jpg"},{"name":"Iron Man","imageurl":"https:\/\/simplifiedcoding.net\/demos\/view-flipper\/images\/ironman.jpg"},{"name":"Thor","imageurl":"https:\/\/simplifiedcoding.net\/demos\/view-flipper\/images\/thor.jpg"},{"name":"Wolverine","imageurl":"https:\/\/simplifiedcoding.net\/demos\/view-flipper\/images\/wolverine.jpeg"}]}
  • 检查每个区分大小写的字段,即您编写的 imageUrl 应该是 imageurl。或者你可以使用@SerializedName("imageurl") private String imageUrl;
  • 如果它工作正确答案是否有任何错误感觉再次询问?
【解决方案2】:

由于你的 JSON,你应该 chande 你的 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-27
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多