Дооснащение + Rx Java Наблюдаемая проблема - PullRequest
0 голосов
/ 11 февраля 2019

Получение некоторых проблем с помощью RXjava + Retrofit, Plz Help

Json, например:

https://api.androidhive.info/json/movies.json

Сортировка экранов ошибок ниже:

enter image description here

Код ниже:

CallInterface movieApiInterface;
Call call;
public final static String BASEURL="https://api.androidhive.info/json/";

private OAuthManager(){}

public static OAuthManager getInstance(){
    if(instance==null){
        instance=new OAuthManager();
        instance.getClient();
    }
    return instance;
}

private void getClient() {
    if (retrofit == null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(BASEURL)
                .addConverterFactory(GsonConverterFactory.create(new Gson()))
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        movieApiInterface = retrofit.create(CallInterface.class);
    }
}
public interface CallInterface {
    @GET("movies.json")
    Observable<List<Movies>> getMoviesList();

}

public Observable<List<Movies>> getMovieApiData(){
    return movieApiInterface.getMoviesList();
}

Работает нормально при простом Retrofit Call, но сталкивается с этой проблемой в Observable.

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Не могли бы вы изменить свою конечную точку, как показано ниже, и повторите попытку, пожалуйста.

public interface CallInterface {
    @GET("movies.json")
    Observable<Movies> getMoviesList();
}

public Observable<Movies> getMovieApiData(){
    return movieApiInterface.getMoviesList();
}

Пожалуйста, дайте мне знать о результате.

0 голосов
/ 11 февраля 2019

Зависит от импортированной версии Retrofit 2.4.0. Вы добавили устаревшую версию Retrofit2RxJava2Adapter :

implementation "com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0"

Retrofit 2.2 и более новыесторонний адаптер вызовов для RxJava 2: https://github.com/square/retrofit/tree/master/retrofit-adapters/rxjava2

Вы просто заменяете это и используете как:

implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'

и

retrofit = new Retrofit.Builder()
       .baseUrl(Const.BASE_URL)
       .client(okHttpClient)
       .addConverterFactory(GsonConverterFactory.create(gson))
       .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // replace this line
       .build();
0 голосов
/ 11 февраля 2019

Из кода, который я вижу, нет проблем, почему бы не попробовать использовать какой-либо RxJava2CallAdapterFactory из rxjava2?Я думаю, что когда он получил значение json и пытается сохранить его, он застрял в .addCallAdapterFactory (RxJavaCallAdapterFactory.create ()), поэтому он возвращает ошибку

Я могу привести пример моей реализациииспользуя Retrofit, чтобы вы могли использовать его в качестве ссылки

в моем Gradle:

implementation 'io.reactivex.rxjava2:rxjava:2.1.12'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation "com.jakewharton.rxbinding2:rxbinding:2.1.1"
implementation "com.github.akarnokd:rxjava2-extensions:0.18.9"

implementation "com.squareup.retrofit2:retrofit:2.4.0"
implementation "com.squareup.retrofit2:converter-gson:2.4.0"
implementation "com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0"
implementation "com.squareup.okhttp3:okhttp:3.10.0"
implementation "com.squareup.okhttp3:okhttp-urlconnection:3.10.0"
implementation "com.squareup.okhttp3:logging-interceptor:3.4.1"

, и это мой ApiClient:

public class ApiClient {
private static Retrofit retrofit = null;
private static OkHttpClient okHttpClient;


public static Retrofit getClient() {

    if (okHttpClient == null)
        initOkHttp();

    if (retrofit == null) {

        final Gson gson = new GsonBuilder()
                .registerTypeAdapter(
                        Travel.class,
                        new JsonTravelSerializer())
                .create();

        retrofit = new Retrofit.Builder()
                .baseUrl(Const.BASE_URL)
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
    }
    return retrofit;
}

private static void initOkHttp() {
    int REQUEST_TIMEOUT = 60;
    OkHttpClient.Builder httpClient = new OkHttpClient().newBuilder()
            .connectTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS)
            .readTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS)
            .writeTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS);

    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    httpClient.addInterceptor(interceptor);

    httpClient.addInterceptor(chain -> {
        Request original = chain.request();
        Request.Builder requestBuilder = original.newBuilder()
                .addHeader("Accept", "application/json")
                .addHeader("Request-Type", "Android")
                .addHeader("Content-Type", "application/json");

        Request request = requestBuilder.build();
        return chain.proceed(request);
    });

    okHttpClient = httpClient.build();
}}

в классе, который вам нужно вызвать

apiservice = ApiClient.getClient().create(ApiService.class);
.....
disposable.add(apiService
            .getJson()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(new DisposableSingleObserver<JsonObject>() {
                @Override
                public void onSuccess(JsonObject jsonObject) {
                    Gson gson = new Gson();
                    String jsonOutput = jsonObject.get("data").toString();
                    Type listType = new TypeToken<List<TravelData>>() {
                    }.getType();
                    List<TravelData> travelData = gson.fromJson(jsonOutput, listType);
                    travelList.clear();
                    travelList.addAll(travelData);

                    adapter = new MainViewAdapter(getSupportFragmentManager());
                    adapter.addAll(travelList);
                    viewPager.setAdapter(adapter);
                }

                @Override
                public void onError(Throwable e) {

                }
            })
    );
...