ошибка приведения observable.subscribe

Как показано в следующем коде, я получаю сообщение об ошибке, связанное со следующей строкой, потому что приведение неверно.

.subscribe((Consumer<? super List<String>>)getAnimalsObserver());

пожалуйста, дайте мне знать, как решить эту проблему.

примечание:

I am using the folloing rx versions
compile 'io.reactivex.rxjava2:rxandroid:2.0.2'
compile 'io.reactivex.rxjava2:rxjava:2.0.5'

код:

import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;

открытый класс MainActivity расширяет AppCompatActivity {

getAnimalsObservable()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe((Consumer<? super List<String>>)getAnimalsObserver());



 private Observer<String> getAnimalsObserver() {
    return new Observer<String>() {

        @Override
        public void onSubscribe(Disposable d) {
            Log.i(TAG, "onSubscribe->d: " + d);
        }

        @Override
        public void onNext(String s) {
            Log.i(TAG, "onNext->s: " + s);
        }

        @Override
        public void onError(Throwable e) {
            Log.i(TAG, "onError->e: " + e);
        }

        @Override
        public void onComplete() {
            Log.i(TAG, "onComplete");
        }
    };
}  

logcat:

Caused by: java.lang.ClassCastException: 
com.example.pc_a.myapplication.MainActivity$1 cannot be cast to 
io.reactivex.functions.Consumer
at com.example.pc_a.myapplication.MainActivity.onCreate(MainActivity.java:38)
at android.app.Activity.performCreate(Activity.java:6288)
at 
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
t android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2642)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2754) 

person LetsamrIt    schedule 17.07.2018    source источник
comment
Как реализован getAnimalsObserver?   -  person akarnokd    schedule 17.07.2018
comment
@akarnokd я обновил код .. пожалуйста, взгляните на него   -  person LetsamrIt    schedule 17.07.2018
comment
Но вы так и не показали свой getAnimalsObserver().   -  person Anatolii    schedule 17.07.2018
comment
@akarnokd Я разместил требуемый метод .. пожалуйста, взгляните на него   -  person LetsamrIt    schedule 17.07.2018
comment
Почему вы вообще кастуете его на Consumer? Не бросайте, и он должен скомпилироваться.   -  person akarnokd    schedule 17.07.2018
comment
@akarnokd, но когда я не использую его, он будет подчеркнут красным, а ошибка гласит: не удается разрешить метод подписки (io.reactivex.Observer java.lang.String   -  person LetsamrIt    schedule 17.07.2018
comment
@Anatolii, я обновил код ... пожалуйста, взгляните на него   -  person LetsamrIt    schedule 17.07.2018


Ответы (1)


Во-первых, вам не нужно приводить к Consumer. Во-вторых, вы должны изменить свой Observer следующим образом, чтобы заставить его работать (Observer уже можно использовать в subscribe). Я немного упростил его, чтобы сделать его более аккуратным:

private Observable<List<String>> getAnimalsObservable() {
    return Observable.fromArray(Arrays.asList(
        new String[]{
            "Ant", "Ape",
            "Bat", "Bee", "Bear", "Butterfly",
            "Cat", "Crab", "Cod",
            "Dog", "Dove",
            "Fox", "Frog"
        }
    ));
}

private Observer<List<String>> getObserver() {
    return new Observer<List<String>>() {
        @Override
        public void onSubscribe(Disposable d) {
            //your logic here
        }

        @Override
        public void onNext(List<String> values) {
            //your logic here
            for (String value : values) {
                System.out.print(value + " ");
            }
        }

        @Override
        public void onError(Throwable e) {
            //your logic here
        }

        @Override
        public void onComplete() {
            //your logic here
        }
    };
}

@Test
public void test() {
    // here you can add your observeOn and subscribeOn but they're not important for the test
    getAnimalsObservable()
        .subscribe(getObserver());
}

Выход:

Муравей Обезьяна Летучая мышь Пчела Медведь Бабочка Кошка Краб Треска Собака Голубь Лиса Лягушка

person Anatolii    schedule 17.07.2018