เกิดข้อผิดพลาดในการส่ง 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");
        }
    };
}  

ล็อกแคท:

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 แต่เมื่อฉันไม่ได้แคสต์มันจะถูกขีดเส้นใต้ด้วยสีแดงและข้อผิดพลาดแจ้งว่า:cant solve method Subscribe(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