Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Не могу заставить работать Retrofit + RxJava

Не могу заставит работать Retrofit + RxJava.
Кто может помочь?
Без RxJava всё работает.
Лямбды никак не могу подключить, поэтому лучше без них.
Готов заплатить за консультацию, уже всю Сеть облазил.
Нужен просто рабочий кусок кода для копипаста, чтобы разобраться.
Как правильно подписаться на события и выполнить свой код в onNext, onError и т.д. ?
Ответ: demixdn - спасибо бро, ты лучший!
Теперь всё работает.
И это в тот момент, когда я уже решил, что обречен на вечное использование Асинктасков
Вопрос: Остановка выполнения RxJava

В процессе изучения RxJava + Retrofit уперся с вопросом как правильно завершить выполнение RxJava?

Что необходимо сделать:
  1. Если человек нажал на авторизацию 2 раза подряд с какой то задержкой, у него ранее запущенный поток должен завершиться и создаться новый(т.е. ответ от сервера должен прийти только на последний запрос).
  2. При выполнении deattach необходимо завершить все запросы и перестать их слушать.

Мой код презентера(после добавления disposable.dispose() в метод Authorization перестал работать) :
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public class LoginPresenter {
    private ILoginView iLoginView;
    private final CompositeDisposable disposable = new CompositeDisposable();
 
    public void attah(ILoginView iLoginView){
        this.iLoginView = iLoginView;
    }
 
    public void deattach(){
        iLoginView = null;
        disposable.dispose();
    }
 
    public void Authorization(String login, String password){
        disposable.dispose();
        disposable.clear();
        
        
        Observable loginObservable = ApiClient.getInstance().getiApi().login("auth", login, password);
        DisposableObserver observer = new DisposableObserver<Response<User>>() {
            @Override
            public void onNext(Response<User> response) {
                if (response != null) {
                    if (response.isSuccessful()) {
                        if (response.body().getCode() == 0) {
                            if (response.headers() != null) {
                                List<String> cookies = response.headers().values("Set-Cookie");
                                if (cookies != null) {
                                    AuthData authData = new AuthData();
                                    authData.fromCookies(cookies);
                                    if (authData.getSessionId() != null) {
                                        AuthData.saveAuthData(ThisApplication.getAppContext(), authData);
                                    }
                                    if (iLoginView != null) {
                                        iLoginView.authSuccess(response.body());
                                    }
                                }
                            }
                        } else {
                            if (iLoginView != null) {
                                iLoginView.authError(response.body().getCode());
                            }
                        }
                    }
                }
            }
 
            @Override
            public void onError(Throwable e) {
                if (iLoginView != null){
                    iLoginView.authError(e.toString());
                }
            }
 
            @Override
            public void onComplete() {
            }
        };
 
        loginObservable
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(d->iLoginView.showLoadingView())
                .doFinally(iLoginView::hideLoadingView)
                .subscribeWith(observer);
        
        disposable.add(observer);
 
    }
}
Ответ:
Сообщение от Hank
Почему должен завершиться текущий запрос?
Возможно я выразился не в реактивном стиле.
Нужно отменить выполнение предыдущего запроса т.к. он уже не актуален(неактуальные параметры запроса например)
Вопрос: RxJava вернуть данные назад

Создал метод
Java
1
generatePlayer(String, String, ApiService)
в нем использую запросы, а так же метод
Java
1
Clan_DannieRx(player.getPersonaly_dannie().getClan_id(), application_id, api);
вызывает еще несколько асинхронных запросов, если условие истинно.
Тут всё работает, все запросы работают правильно. Возник вопрос, после того как все выполнилось, вернуть мне данные назад.
Java
1
generatePlayer(String, String, ApiService)
стоит пока с типом возврата
Java
1
void
, но хочу сделать чтоб пользовательский тип данных возвращал.

То есть в другом месте я мог сделать вот так
Java
1
Person = generatePlayer("name", "2323", api);
Вот что у меня есть.



Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 public void generatePlayer(final String account_id, final String application_id, final ApiService api)
        {
            final GenerateDannie generateDannie = new GenerateDannie();
            final String[] response = new String[1];
            clan_dannie = new Clan_Dannie();
    
            ApiService apiMod = RetroClient.getApiServiceMod();
            final HashMap<String, String> hashMap = new HashMap<>();
    
            //Генерирует персональные данные
            Flowable<Response<ResponseBody>> FlowablePersonallyDanie = api.getPersonallyDannie(account_id, application_id)
                    .mergeWith(api.getInfoTexnika(application_id))  
                    .mergeWith(api.getTexnikaPlayer(account_id, application_id))
                    .mergeWith(api.getStatistikaTexnika(account_id, application_id))    
                    .mergeWith(api.getDostizenie(application_id))   //Достижения
                    .mergeWith(api.getDostizeniePlayer(account_id, application_id))  
                    .mergeWith(api.getDostizenieTexnika(account_id, application_id)) 
                    .mergeWith(apiMod.getModWin8()); 
    
            FlowablePersonallyDanie
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new FlowableSubscriber<Response<ResponseBody>>() {
                        @Override
                        public void onSubscribe(Subscription s) {
                            s.request(Long.MAX_VALUE);
                        }
                        @Override
                        public void onNext(Response<ResponseBody> responseBodyResponse) {
                            //Прилетел ответ
                            try {
                                String url =String.valueOf(responseBodyResponse.raw().request().url());
                                String response = responseBodyResponse.body().string();
                                Log.e("URL", url);
                                Log.e("TAG", response);
                                hashMap.put(url, response);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        @Override
                        public void onError(Throwable t) {
                            //Ошибка
                        }
    
                        @Override
                        public void onComplete() {
                            //В случае выполнения
                            generatePlayerDannie(hashMap, account_id);
                           if(!player.getPersonaly_dannie().getClan_id().isEmpty())
                               Clan_DannieRx(player.getPersonaly_dannie().getClan_id(), application_id, api);
                           // player.setClan_dannie(clan_dannie);
                        }
                    });
}
Ответ: Да сейчас посмотрю. Да вы правы у меня синхронное приложение. Просто у меня есть кнопка, которая обновляет данные с сервера. И я сделал асинхронные запросы, для того чтоб выполнить запросы параллельно, чтоб уменьшить время обновления данных. А пока эти данные обновляются, у меня выводит ProgressDialog, показывая пользователю что идет обновления. Больше мне ненужна асинхронность
Вопрос: Proguard cant find referennce

Интегрирую proguard в проект, столкнулся с проблемой, выдается предупреждения

Цитата

[proguard] Warning: com.pushwoosh.support.v4.app.RemoteInputCompatApi20: can't
find referenced class android.app.RemoteInput$Builder
 [proguard] Warning: com.pushwoosh.support.v4.app.RemoteInputCompatApi20: can't
find referenced class android.app.RemoteInput


Когда добавляю строки
Цитата

-keep class com.pushwoosh.support.v4.app.RemoteInput
-keep class android.app.RemoteInput


Появляется следующая ошибка и проблема не устраняется
Цитата

[proguard] Maybe you meant the fully qualified name 'com.pushwoosh.support.v4.app.RemoteInput'?


Подскажите как это можно поправить
Ответ:
Интегрирую proguard в проект, столкнулся с проблемой, выдается предупреждения

Цитата

[proguard] Warning: com.pushwoosh.support.v4.app.RemoteInputCompatApi20: can't
find referenced class android.app.RemoteInput$Builder
 [proguard] Warning: com.pushwoosh.support.v4.app.RemoteInputCompatApi20: can't
find referenced class android.app.RemoteInput


Когда добавляю строки
Цитата

-keep class com.pushwoosh.support.v4.app.RemoteInput
-keep class android.app.RemoteInput


Появляется следующая ошибка и проблема не устраняется
Цитата

[proguard] Maybe you meant the fully qualified name 'com.pushwoosh.support.v4.app.RemoteInput'?


Подскажите как это можно поправить
Вопрос: Nike specializes in footwea

These kinds of colorways white and black color is considered one of the most colorways of the Jordan Brand asked. That Nike running shoes designed higher original form to help particularly adapted for the NBA players, Nike Sportswear shoes. re-interpreted " A new look is actually late. Air Jordan's Tumble 2009 release soon to hit U. S. and European markets . More than worn out tennis shoes, sports, these parties usually are comfortable and casual clothes, managing biker-inspired boot. This indicates which positioning strategies are crucial in the development of a marketing strategy as all elements of the master plan can potentially influence how a firm positions their product. Degrees of positioning strategies included placement by attributes, price-quality, opponents.



So base on the survey has done for student coming from 18 to 25 years previous in Kent International University, a lot of things can be found out of these buying behavior and the image of Nike in their thoughts by answering questionnaires to handle their purchasing habit, cash flow, interest in sport shoes, etc . All analysis will be within the body part of research paper which usually talks about not only Nike Woman Air Max Running shoes, but also running sneakers industry, especially the placing of Nike in the client's mind which can analyze the actual marketing mix of . Get back information, Nike will get considerably more knowledge about Vietnamese market and consumer to have a suitable advertising campaigns to maximum earnings in Vietnamese market.

Dolomite is facing the same problem of Foxconn, one of partner manufacture of Apple's product or service, is poor environment regarding workers. This indicates clearly by protests of Vietnamese. As per "Vietnam Talking Point", with April 2010, thousands of Chinese Nike factory workers went on strike due to poor doing work conditions and low salary. In fact , this is taking place wherever Nike factories are positioned. Because of keeping low costs together of completive advantages , Dolomite did not pay attention to the rights regarding workers. The positioning decision is often a very crucial tactical decision for a brand or maybe company as the position may be central to customer’s understanding and choices. Customer requires and wants, as well as the durability and weaknesses of challengers need to be linked in order for an item to be positioned effectively out there.

Nike specializes in footwear, attire, equipment and accessory merchandise for men, women and children. The company offers footwear for basketball, basketball, soccer, baseball, rugby, golf, walking, sport-inspired informal shoes, kids' shoes as well as other athletic and recreational requirements. Along with footwear the company in addition markets sports apparel and also accessories, along with sports influenced apparel and athletic bags. Along with these  even offers performance equipments which include bags, socks, sport balls, sunglasses, electronic devices, bats, gloves, golf equipment, and other equipments designed for athletics under the brand name NIKE. Products are mostly sold through the retail stores, independent distributors, franchisees, licensees and also through ecommerce.
Ответ:
These kinds of colorways white and black color is considered one of the most colorways of the Jordan Brand asked. That Nike running shoes designed higher original form to help particularly adapted for the NBA players, Nike Sportswear shoes. re-interpreted " A new look is actually late. Air Jordan's Tumble 2009 release soon to hit U. S. and European markets . More than worn out tennis shoes, sports, these parties usually are comfortable and casual clothes, managing biker-inspired boot. This indicates which positioning strategies are crucial in the development of a marketing strategy as all elements of the master plan can potentially influence how a firm positions their product. Degrees of positioning strategies included placement by attributes, price-quality, opponents.



So base on the survey has done for student coming from 18 to 25 years previous in Kent International University, a lot of things can be found out of these buying behavior and the image of Nike in their thoughts by answering questionnaires to handle their purchasing habit, cash flow, interest in sport shoes, etc . All analysis will be within the body part of research paper which usually talks about not only Nike Woman Air Max Running shoes, but also running sneakers industry, especially the placing of Nike in the client's mind which can analyze the actual marketing mix of . Get back information, Nike will get considerably more knowledge about Vietnamese market and consumer to have a suitable advertising campaigns to maximum earnings in Vietnamese market.

Dolomite is facing the same problem of Foxconn, one of partner manufacture of Apple's product or service, is poor environment regarding workers. This indicates clearly by protests of Vietnamese. As per "Vietnam Talking Point", with April 2010, thousands of Chinese Nike factory workers went on strike due to poor doing work conditions and low salary. In fact , this is taking place wherever Nike factories are positioned. Because of keeping low costs together of completive advantages , Dolomite did not pay attention to the rights regarding workers. The positioning decision is often a very crucial tactical decision for a brand or maybe company as the position may be central to customer’s understanding and choices. Customer requires and wants, as well as the durability and weaknesses of challengers need to be linked in order for an item to be positioned effectively out there.

Nike specializes in footwear, attire, equipment and accessory merchandise for men, women and children. The company offers footwear for basketball, basketball, soccer, baseball, rugby, golf, walking, sport-inspired informal shoes, kids' shoes as well as other athletic and recreational requirements. Along with footwear the company in addition markets sports apparel and also accessories, along with sports influenced apparel and athletic bags. Along with these  even offers performance equipments which include bags, socks, sport balls, sunglasses, electronic devices, bats, gloves, golf equipment, and other equipments designed for athletics under the brand name NIKE. Products are mostly sold through the retail stores, independent distributors, franchisees, licensees and also through ecommerce.
Вопрос: Retrofit 2 + RxAndroid + VkApi. Как возвратить ответ?

Здравствуйте!
Захотелось в своем приложении использовать rxAndroid. Но нашлась проблема при использовании данной библиотеки.

Сразу краткий пример:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   public interface ApiInterface {
 
    public static final String BASE_URL = "https://api.vk.com/method/";
 
    @GET("users.get?")
    rx.Observable<ProfileInfo> getProfileInfo(
            @Query("user_ids") String user_ids,
            @Query("v") String version);
 
    public static final Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
}
Модели ответа:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ProfileInfo {
 
    @SerializedName("response")
    private ArrayList<ResponseProfileInfo> response = new ArrayList<>();
 
    public ProfileInfo(ArrayList<ResponseProfileInfo> response) {
        this.response = response;
    }
 
    public ProfileInfo() {
        this.response = response;
    }
 
    public ArrayList<ResponseProfileInfo> getResponse() {
        Log.d("123", "3123 ");
        return response;
    }
 
    public void setResponse(ArrayList<ResponseProfileInfo> response) {
        this.response = response;
    }
}

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class ResponseProfileInfo {
 
    @SerializedName("id")
    private int id;
    @SerializedName("first_name")
    private String firstName;
    @SerializedName("last_name")
    private String lastName;
 
 
 
    public int getId() {
        return id;
    }
    public void setId(int id) {this.id = id;}
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
 
}
Пример использования:

Java
1
2
3
4
5
ApiInterface vkService= ApiInterface.retrofit.create(ApiInterface.class);
        Observable<ProfileInfo> call=vkService.getProfileInfo("210700286","5.59");
 
         call.flatMap(response -> Observable.from(response.getResponse()))
                .subscribe(responseProfileInfo1 -> Log.d("TAG", responseProfileInfo1.getLastName()));
Проблема соответственно тут:

Java
1
2
 call.flatMap(response -> Observable.from(response.getResponse()))
                .subscribe(responseProfileInfo1 -> Log.d("TAG", responseProfileInfo1.getLastName()));
Причем самое странное, что такой подход сработал и всё было ОК. Но вот после нескольких экспериментов данный метод заглох, приложение начало крашится дойдя до call... После нескольких попыток начал работать вот такой пример:

Java
1
2
3
call.map(profileInfo -> Observable.from(profileInfo.getResponse()))
                .map(responseProfileInfoObservable -> responseProfileInfoObservable
                        .subscribe(responseProfileInfo ->Log.d("TAG", "В Результате " + responseProfileInfo.getFirstName())));
Но попробовав сделать "ещё что-нибудь" и снова вернувшись к варианту номер 2, данный подход просто ничего не логировал, но при этом не крашился.

Пробовал и очищать и экспериментировать с gradle. но не вышло. Использую Android Studio 2.1.3



Вот gradle:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
apply plugin: 'com.android.application'
apply plugin: 'android-apt'
apply plugin: 'me.tatarka.retrolambda'
 
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"
 
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    defaultConfig {
        applicationId "com.pack.vkdesk"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
 
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
 
    compile 'com.google.code.gson:gson:2.6.2'
 
    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
 
    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'io.reactivex:rxjava:1.2.1'
 
    compile 'com.jakewharton:butterknife:8.4.0'
    apt 'com.jakewharton:butterknife-compiler:8.4.0'
 
}


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.3'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        classpath 'me.tatarka:gradle-retrolambda:3.2.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
 
allprojects {
    repositories {
        jcenter()
    }
}
 
task clean(type: Delete) {
    delete rootProject.buildDir
}
Ответ: xaat, спасибо, помогло
Вопрос: Восстановить проект

Потерял все файлы проекта, осталось все в гите. Но я забыл внести build.gradle уровня проекта. То есть у меня осталась только папка app. Подскажите пожалуйста как открыть теперь этот проект и восстановить его?
За ранее всем спасибо за ответы
build.gradle уровня app у меня такой:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
apply plugin: 'com.android.application'
apply plugin: 'hugo'
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'com.neenbedankt.android-apt'
 
retrolambda {
    incremental false
}
 
android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
 
    compileSdkVersion 24
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "убрал"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
 
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
 
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
 
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.google.dagger:dagger:2.0'
    compile 'frankiesardo:icepick:3.1.0'
    compile 'com.jakewharton:butterknife:7.0.1'
    compile 'io.reactivex:rxandroid:1.1.0'
    compile 'io.reactivex:rxjava:1.1.0'
    compile 'com.squareup:otto:1.3.8'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.squareup.retrofit2:retrofit:2.0.0'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'
    compile 'com.squareup.okhttp3:logging-interceptor:3.0.0-RC1'
    compile 'com.google.code.gson:gson:2.5'
    compile 'com.android.support:support-v4:24.2.1'
    compile 'com.android.support:recyclerview-v7:24.2.1'
    compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
    compile 'io.realm:realm-android:0.87.5'
    compile 'com.android.support:cardview-v7:24.2.1'
    compile 'com.android.support:design:24.2.1'
    compile 'com.astuetz:pagerslidingtabstrip:1.0.1'
    compile 'asia.ivity.android:marqueeview:1.1.5@aar'
    testCompile 'junit:junit:4.12'
    apt 'com.google.dagger:dagger-compiler:2.0'
    apt 'frankiesardo:icepick-processor:3.1.0'
    provided 'org.glassfish:javax.annotation:10.0-b28'
}
Единственное убрал applicationId, не хочется его показывать
Ответ: Восстановить build.gradle не получается
Остановился на таком варианте:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
buildscript {
    repositories {
        jcenter()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
        maven {url "https://clojars.org/repo/"}
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0'
        classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
        classpath "gradle.plugin.me.tatarka:gradle-retrolambda:3.6.0"
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
    }
}
 
allprojects {
    repositories {
        jcenter()
    }
}
 
task clean(type: Delete) {
    delete rootProject.buildDir
}
Но вот восстановить для icepick-processor не могу

Добавлено через 34 минуты
Все поставил, но вот icepick не хочет ставиться
Вопрос: Дополнительные либы

Привет народ, в поисках вакансий видел такие требования:
RxJava/RxAndroid
Retrofit2
Dagger 2 и т.д.

Погуглил, почитал(Сам разработкой под android около 6 месяцев, еще зеленый). все ровно особо не понятно.
В общем есть несколько вопросов:

1. В чем отличие? Если например, использовать стандартные либы.(быстродействие?)
1.1. В каких приложениях их лучше применять, (ну например, будильник или какой-нибуть чат клиент)
2. Какие плюсы они вообще дают?? кроме как быстродействие.
Ответ: powowstal, ну я и работаю со стандартными средствами. спасибо за ответ)
Вопрос: Извлечение модели ошибки retrofit + rx

Работаю с Retrofit и RX.
Через Gradle подключаю так:
Java
1
2
3
    compile 'com.squareup.retrofit2:retrofit:2.0.0'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'
Интерфейс сделал, и его инжект так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Provides
    @Singleton
    public AbbreviationsApi provideApi() {
 
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
 
 
        OkHttpClient httpClient = new OkHttpClient.Builder()
                .addInterceptor(getInterceptor())
                .addInterceptor(logging)
                .build();
 
        return new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(GsonHelper.getRealmGson()))
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(httpClient)
                .build()
                .create(AbbreviationsApi.class);
    }
AbbreviationsApi - интерфейс с моими методами

Вот так посылаю запросы и получаю в Json модель свою.
Java
1
2
3
4
Subscription subscription = getAbbreviationsApi().register(reg)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(user -> complete(user), error -> er(error));
В случае ошибки сервер отдаст другую модель, код будет не 200, а 400. А как забрать эту модель ошибки себе? Ведь если код 400 - то всё направляется как исключение в мой метод er(error)

Спасибо за помощь за ранее!
Ответ: zuxa-zuxa, точно не знаю, проверь. И скажи о результате, буду и я знать.

Добавлено через 9 минут
GsonConverterFactory указывался для моделек в интерфейсе для success ответа. Для error часто ответ приходит совсем другая моделька и GsonConverterFactory не знает в какую ее парсить. Так что скорей всего придется вручную это сделать.
Вопрос: Заполнить spinner данными из сети

Нужно из json получить список категорий и потом поместить в спиннер. (Нужно для поиска товара: категория + текст) Делаю так

Сеть. Retrofit +rxJava

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
ViewInterface mvi;
 @Override
 public void getCategories() {
            getObservableCategories().subscribeWith(getObserver());
 
 
        }
 
 
        public Observable<Categories> getObservableCategories(){
            return NetworkClient.getRetrofit().create(NetworkInterface.class)
                    .getCategories("apikeys")
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread());
        }
 
 
        public DisposableObserver<Categories> getObserver(){
            return new DisposableObserver<Categories>() {
 
                @Override
                public void onNext(@NonNull Categories categories) {
                    mvi.displayCategories(categories);
                }
 
                @Override
                public void onError(@NonNull Throwable e) {
                    Log.d(TAG,"Error"+e);
                    e.printStackTrace();
                    mvi.displayError("Error Data");
                }
 
                @Override
                public void onComplete() {
                    Log.d(TAG,"Completed");
                    mvi.hideProgressBar();
                }
            };
        }
Сам спиннер

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
                    ViewGroup container,Bundle savedInstanceState) {
                     View view = inflater.inflate(R.layout.fragment_one,container,false);
                    spinner= view.findViewById(R.id.spinner);
 
        ArrayAdapter<String> adapter = new ArrayAdapter<>(Objects.requireNonNull(this.getActivity()), android.R.layout.simple_spinner_item, categList);
                                        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                                        spinner.setAdapter(adapter);
 
         AdapterView.OnItemSelectedListener onItemSelectedListener = new AdapterView.OnItemSelectedListener() {
                                            @Override
                                            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                                                Log.d("Selected",(String)parent.getItemAtPosition(position));
                                            }
 
                                            @Override
                                            public void onNothingSelected(AdapterView<?> parent) {
 
                                            }
                                        };
                                        spinner.setOnItemSelectedListener(onItemSelectedListener);
 
return view;
ArrayList
Java
1
2
3
4
5
6
7
 @Override
        public void displayCategories(Categories categories) {
            for (int i=0;i<categories.getResults().size();i++) {
              categList.add(categories.getResults().get(i).getCategoryName());
            }
 
        }
Сам спиннер находится во Fragment , а запросы в сеть в другом классе. Если создать массив с категориями прям во фрагменте,то спиннер работает нормально. Если передавать(displayCategories) - то только, в раскрытом виде и нельзя нечего выбрать(getItemAtPosition). Заранее спасибо.
Ответ: Нашел решение. Перенес адаптер в displayCategories(Categories categories).