Android: вызов API с использованием RxJava, возвращающий нулевой ответ - PullRequest
0 голосов
/ 21 марта 2019

Я использую Retrofit для выполнения вызова API. Когда я обрабатываю ответ, получаю сообщение об ошибке, я пытаюсь получить данные этого вызова API на этой странице https://my -json-server.typicode.com / jayraic / demo / db

Попытка вызвать метод интерфейса 'java.lang.Object java.util.List.get (int)' для ссылки на пустой объект

Модифицированный базовый вызов

public class NBADataFactory {

        private final static String BASE_URL = "https://my-json-server.typicode.com/jayraic/demo/";
        public final static String DB_URL = "https://my-json-server.typicode.com/jayraic/demo/db";

        public static NBAService create() {
            Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();
            return retrofit.create(NBAService.class);

        }

Модифицированный вызов

private void fetchTeamList() {

        NBAApplication nbaApplication = NBAApplication.create(context);
        NBAService nbaService = nbaApplication.getNbaService();

        Disposable disposable = nbaService.fetchTeam(NBADataFactory.DB_URL)
                .subscribeOn(nbaApplication.subscribeScheduler())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<NBAResponse>() {
                    @Override
                    public void accept(NBAResponse nbaResponse) {
                        changeTeamDataSet(nbaResponse.getTeamList());
                        teamProgress.set(View.GONE);
                        teamLabel.set(View.GONE);
                        teamRecycler.set(View.VISIBLE);
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) {
                        messageLabel.set(context.getString(R.string.error_loading_people));
                        teamProgress.set(View.GONE);
                        teamLabel.set(View.VISIBLE);
                        teamRecycler.set(View.GONE);
                    }
                });

        compositeDisposable.add(disposable);
    }

    private void changeTeamDataSet(List<Team> teams) {
        teamList.addAll(teams);
        setChanged();
        notifyObservers();
    }

Модель ответа

public class NBAResponse {

    List<Team> teamList;

    public List<Team> getTeamList() {
        return teamList;
    }
}

Модель команды

public class Team implements Serializable {

    @SerializedName("id") public String id;

    @SerializedName("full_name") public String full_name;

    @SerializedName("win") public String win;

    @SerializedName("losses") public String losses;

    @SerializedName("players") public List<Player> players;
}

Я пробую это и застрял в этой проблеме, любая помощь или направление на правильный путь будут оценены.

1 Ответ

0 голосов
/ 21 марта 2019

Ответ json имеет teams в качестве имени внешнего массива, но в вашем ответе класс Pojo имеет имя teamList.Любое из нижеперечисленного должно решить вашу проблему

List<Team> teams;

или

@SerializedName("teams")
List<Team> teamList;
...