Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Rom96
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 35
1

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

18.10.2016, 16:03. Просмотров 1329. Ответов 4

Здравствуйте!
Захотелось в своем приложении использовать 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
}
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2016, 16:03
Ответы с готовыми решениями:

Как работать с VKApi
Хочу воспользоваться функциями VK Api в C# Как и с чего начинать? Заранее Спасибо

Как отправить решение капчи VkApi
через catch получаю рисунок, не знаю как реализовать именно передачу капчи на сервис по нажатию...

Как слать запрос для постинга на стенку [VKAPI]
Привет всем. Начала потихоньку изучать Delphi, ну как изучать....хочу реализовать спамер вк по...

Retrofit - как запретить кеширование
Как очищать или запретить кешировать и не сохранять информацию о предыдущем подключении для...

Как узнать какой url формирует Retrofit
Здравствуйте. Пытаюсь получить данные с openweathermap. Вот код: public interface...

4
xaat
43 / 16 / 6
Регистрация: 05.12.2015
Сообщений: 65
18.10.2016, 17:24 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())
И еще, в таких случаях нужно выкладывать лог ошибки.
И используй полную запись без лямбд и упрощений, пока не разберешься в технологии.
0
Rom96
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 35
18.10.2016, 18:37  [ТС] 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
0
xaat
43 / 16 / 6
Регистрация: 05.12.2015
Сообщений: 65
19.10.2016, 01:19 4
Лучший ответ Сообщение было отмечено Rom96 как решение

Решение

Добавлено через 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);
1
Rom96
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 35
19.10.2016, 01:26  [ТС] 5
xaat, спасибо, помогло
0
19.10.2016, 01:26
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2016, 01:26

Как возвратить элемент ?
Объясните пожалуйста кок возвратить array в Main что то не как не могу понять : ( буду очееень...

Как возвратить указатель
Как из intova() возвратить указатель чтобы напечатать матрицу в main?? int main() { int n, m;...

Как возвратить переменную из dll?
нужно возвратить переменную из dll. Имеется код dll: #include&lt;windows.h&gt; #define Export extern...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru