kesalahan casting yang dapat diamati.berlangganan

Seperti yang ditunjukkan pada kode berikut, saya menerima kesalahan terkait baris berikut, karena castingnya tidak benar

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

tolong beri tahu saya cara memperbaiki masalah ini.

catatan:

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

kode:

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;

kelas publik MainActivity memperluas 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 sumber
comment
Bagaimana getAnimalsObserver diimplementasikan?   -  person akarnokd    schedule 17.07.2018
comment
@akarnokd saya memperbarui kodenya..silakan melihatnya   -  person LetsamrIt    schedule 17.07.2018
comment
Namun Anda tetap tidak menampilkan getAnimalsObserver() Anda.   -  person Anatolii    schedule 17.07.2018
comment
@akarnokd Saya memposting metode yang diperlukan..silakan melihatnya   -  person LetsamrIt    schedule 17.07.2018
comment
Mengapa Anda mentransmisikannya ke Consumer? Jangan transmisikan dan itu harus dikompilasi.   -  person akarnokd    schedule 17.07.2018
comment
@akarnokd tetapi ketika saya tidak mentransmisikannya, itu akan digarisbawahi dengan warna merah dan kesalahannya mengatakan: tidak dapat menyelesaikan metode berlangganan (io.reactivex.Observer java.lang.String   -  person LetsamrIt    schedule 17.07.2018
comment
@Anatolii saya memperbarui kodenya ... silakan melihatnya   -  person LetsamrIt    schedule 17.07.2018


Jawaban (1)


Pertama, Anda tidak perlu melakukan transmisi ke Consumer. Kedua, Anda harus memodifikasi Observer Anda sebagai berikut agar berfungsi (Observer sudah dapat digunakan di subscribe). Saya menyederhanakannya sedikit agar lebih rapi:

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());
}

Keluaran:

Semut Kera Kelelawar Lebah Beruang Kupu-kupu Kucing Kepiting Cod Anjing Merpati Katak Rubah

person Anatolii    schedule 17.07.2018