Форум программистов, компьютерный форум CyberForum.ru

Retrofit 2 + RxAndroid + VkApi. Как возвратить ответ? - Android

Восстановить пароль Регистрация
 
Rom96
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 35
18.10.2016, 16:03     Retrofit 2 + RxAndroid + VkApi. Как возвратить ответ? #1
Здравствуйте!
Захотелось в своем приложении использовать 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
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2016, 16:03     Retrofit 2 + RxAndroid + VkApi. Как возвратить ответ?
Посмотрите здесь:

Прокладывание маршрута и Retrofit Android
Android OPTIONS запросы в Retrofit
Android Retrofit, JSON, @POST, @GET
Библиотека Retrofit Android
Retrofit Recyclerview Android
Android Ошибка JSON в Retrofit
Android Retrofit 2. Возвращаемое значение == null
Android Относительные пути в аннотациях Retrofit

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xaat
40 / 13 / 6
Регистрация: 05.12.2015
Сообщений: 64
18.10.2016, 17:24     Retrofit 2 + RxAndroid + VkApi. Как возвратить ответ? #2
В твоем случае flatMap не нужен,
Java
1
2
3
4
 
ApiInterface vkService= ApiInterface.retrofit.create(ApiInterface.class);
Observable<ProfileInfo> call=vkService.getProfileInfo("210700286","5.59");
call.subscribe(responseProfileInfo1 -> Log.d("TAG", responseProfileInfo1.getLastName())
И еще, в таких случаях нужно выкладывать лог ошибки.
И используй полную запись без лямбд и упрощений, пока не разберешься в технологии.
Rom96
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 35
18.10.2016, 18:37  [ТС]     Retrofit 2 + RxAndroid + VkApi. Как возвратить ответ? #3
xaat, К сожалению данное решение не подходит. Предлагает вернуть только вернуть сам ArrayList

вот лог вот такой попытки к примеру без лямбд
Java
1
2
3
4
5
6
7
8
9
call.subscribe(new Action1<ProfileInfo>() {
            @Override
            public void call(ProfileInfo profileInfo) {
                ArrayList<ResponseProfileInfo> profileInfos = profileInfo.getResponse();
 
                for(ResponseProfileInfo responseProfileInfo : profileInfos)
                    Log.d("TAG", responseProfileInfo.getFirstName());
            }
        });
Сам лог:
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
10-18 18:34:50.578 23209-23209/com.pack.vkdesk E/AndroidRuntime: FATAL EXCEPTION: main
                                                                 Process: com.pack.vkdesk, PID: 23209
                                                                 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { (has extras) }} to activity {com.pack.vkdesk/com.pack.vkdesk.presentation.activity.ProfileActivity}: rx.exceptions.OnErrorNotImplementedException
                                                                     at android.app.ActivityThread.deliverResults(ActivityThread.java:3717)
                                                                     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3760)
                                                                     at android.app.ActivityThread.access$1400(ActivityThread.java:171)
                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1357)
                                                                     at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                     at android.os.Looper.loop(Looper.java:146)
                                                                     at android.app.ActivityThread.main(ActivityThread.java:5679)
                                                                     at java.lang.reflect.Method.invokeNative(Native Method)
                                                                     at java.lang.reflect.Method.invoke(Method.java:515)
                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
                                                                     at dalvik.system.NativeStart.main(Native Method)
                                                                  Caused by: rx.exceptions.OnErrorNotImplementedException
                                                                     at rx.internal.util.InternalObservableUtils$ErrorNotImplementedAction.call(InternalObservableUtils.java:386)
                                                                     at rx.internal.util.InternalObservableUtils$ErrorNotImplementedAction.call(InternalObservableUtils.java:383)
                                                                     at rx.internal.util.ActionSubscriber.onError(ActionSubscriber.java:44)
                                                                     at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:153)
                                                                     at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:115)
                                                                     at retrofit2.adapter.rxjava.OperatorMapResponseToBodyOrError$1.onError(OperatorMapResponseToBodyOrError.java:52)
                                                                     at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:178)
                                                                     at rx.Subscriber.setProducer(Subscriber.java:209)
                                                                     at rx.Subscriber.setProducer(Subscriber.java:205)
                                                                     at rx.Subscriber.setProducer(Subscriber.java:205)
                                                                     at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152)
                                                                     at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138)
                                                                     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
                                                                     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
                                                                     at rx.Observable.subscribe(Observable.java:10296)
                                                                     at rx.Observable.subscribe(Observable.java:10263)
                                                                     at rx.Observable.subscribe(Observable.java:10068)
                                                                     at com.pack.vkdesk.presentation.activity.ProfileActivity.getInfo(ProfileActivity.java:61)
                                                                     at com.pack.vkdesk.presentation.activity.ProfileActivity.onActivityResult(ProfileActivity.java:52)
                                                                     at android.app.Activity.dispatchActivityResult(Activity.java:5775)
                                                                     at android.app.ActivityThread.deliverResults(ActivityThread.java:3713)
                                                                     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3760)*
                                                                     at android.app.ActivityThread.access$1400(ActivityThread.java:171)*
                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1357)*
                                                                     at android.os.Handler.dispatchMessage(Handler.java:102)*
                                                                     at android.os.Looper.loop(Looper.java:146)*
                                                                     at android.app.ActivityThread.main(ActivityThread.java:5679)*
                                                                     at java.lang.reflect.Method.invokeNative(Native Method)*
                                                                     at java.lang.reflect.Method.invoke(Method.java:515)*
                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)*
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)*
                                                                     at dalvik.system.NativeStart.main(Native Method)*
                                                                  Caused by: android.os.NetworkOnMainThreadException
                                                                     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1166)
                                                                     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
                                                                     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
                                                                     at java.net.InetAddress.getAllByName(InetAddress.java:214)
                                                                     at okhttp3.Dns$1.lookup(Dns.java:39)
                                                                     at okhttp3.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:173)
                                                                     at okhttp3.internal.http.RouteSelector.nextProxy(RouteSelector.java:139)
                                                                     at okhttp3.internal.http.RouteSelector.next(RouteSelector.java:81)
                                                                     at okhttp3.internal.http.StreamAllocation.findConnection(StreamAllocation.java:172)
                                                                     at okhttp3.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:123)
                                                                     at okhttp3.internal.http.StreamAllocation.newStream(StreamAllocation.java:93)
                                                                     at okhttp3.internal.http.HttpEngine.connect(HttpEngine.java:296)
                                                                     at okhttp3.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
                                                                     at okhttp3.RealCall.getResponse(RealCall.java:243)
                                                                     at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:201)
                                                                     at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163)
                                                                     at okhttp3.RealCall.execute(RealCall.java:57)
                                                                    at retrofit2.OkHttpCall.execute
xaat
40 / 13 / 6
Регистрация: 05.12.2015
Сообщений: 64
19.10.2016, 01:19     Retrofit 2 + RxAndroid + VkApi. Как возвратить ответ? #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Добавлено через 9 минут
Java
1
observable.subscribeOn(Schedulers.newThread())
Это не полная запись.
Полная запись
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Subscriber<ProfileInfo> mySubscriber = new Subscriber<ProfileInfo>() {
            @Override
            public void onNext(InstIndex s) {
 
            }
 
            @Override
            public void onCompleted() {
                Log.e(AppData.LOG_TAG, "mySubscriber onCompleted s:");
 
            }
 
            @Override
            public void onError(Throwable e) {
                Log.i(AppData.LOG_TAG, "mySubscriber onError:" + e);
 
            }
        };
 
        observable.subscribeOn(Schedulers.newThread())
                .subscribe(mySubscriber);
Rom96
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 35
19.10.2016, 01:26  [ТС]     Retrofit 2 + RxAndroid + VkApi. Как возвратить ответ? #5
xaat, спасибо, помогло
Yandex
Объявления
19.10.2016, 01:26     Retrofit 2 + RxAndroid + VkApi. Как возвратить ответ?
Ответ Создать тему

Метки
api, java android
Опции темы

Текущее время: 17:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru