簡體   English   中英

用RxJava中的observable替換回調

[英]Replace callbacks with observables from RxJava

我使用偵聽器作為回調來觀察Android的異步操作,但我認為用RxJava替換這個偵聽器可能很棒,我是新的使用這個庫,但我真的很喜歡它,我總是在Android項目中使用它。

這是我重構的代碼:

public void getData( final OnResponseListener listener ){
   if(data!=null && !data.isEmpty()){
       listener.onSuccess();
   }
   else{
       listener.onError();
   }
}

一個簡單的回調:

public interface OnResponseListener {
   public void onSuccess();
   public void onError(); 
}

而“觀察者”:

object.getData( new OnResponseListener() {
    @Override
    public void onSuccess() {
       Log.w(TAG," on success");
    }

    @Override
    public void onError() {
       Log.e(TAG," on error");
    }
});

謝謝!

例如,您可以使用Observable.fromCallable為您的數據創建observable。

public Observable<Data> getData(){
    return Observable.fromCallable(() -> {
        Data result = null;
        //do something, get your Data object
        return result;
    });
}

然后使用你的數據

 getData().subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(data -> {
                //do something with your data
            }, error -> {
                //do something on error
            });

使用rxjava 1.x和lambda表達式。

編輯:

如果我理解你,你想要替換那個監聽器,而不是把它包裝成可觀察的。 我在參考你的評論時添加了其他例子。 哦..如果你只期待一件商品,也應該使用Single

public Single<Data> getData() {
        return Single.create(singleSubscriber -> {
            Data result = object.getData();
            if(result == null){
                singleSubscriber.onError(new Exception("no data"));
            } else {
                singleSubscriber.onSuccess(result);
            }
        });
    }

getData().subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(data -> {
                //do something with your data
            }, error -> {
                //do something on error
            });

您正在尋找Completable.create

Completable :表示沒有任何值的延遲計算,但僅表示完成或異常。 該類遵循與Reactive-Streams類似的事件模式:onSubscribe(onError | onComplete)?

Completable.create(subscriber -> {
    object.getData(new OnResponseListener() {
        @Override
        public void onSuccess() {
           subscriber.onCompleted();
        }

        @Override
        public void onError() {
           subscriber.onError(* put appropriate Throwable here *);
        }
    }
})
...//apply Schedulers
.subscribe((() -> *success*), (throwable -> *error*));

我將如何重構你的代碼; 除了getData方法,我還將getData方法包裝為Single:

public void getData( final OnResponseListener listener ){
    if(data!=null && !data.isEmpty()){
        listener.onSuccess();
    }
    else{
        listener.onError();
    }
}

public Single<Boolean> getDataSingle() {
    return Single.create(new SingleOnSubscribe<Boolean>() {
        @Override
        public void subscribe(SingleEmitter<Boolean> e) throws Exception {
            getData(new OnResponseListener() {
                @Override
                public void onSuccess() {
                    e.onSuccess(true);
                }

                @Override
                public void onError() {
                    e.onSuccess(false);
                }
            });
        }
    });
}

或者使用Java 8:

public Single<Boolean> getDataSingle() {
    return Single.create(e -> getData(
            new OnResponseListener() {
                @Override
                public void onSuccess() {
                    e.onSuccess(true);
                }

                @Override
                public void onError() {
                    e.onSuccess(false);
                }
            })
    );
}

現在,您已經在回調函數旁邊公開了一個Rx API。 假設它是您自己的某種DataProvider,您現在可以在不處理回調的情況下使用它,如下所示:

dataProvider.getDataSingle()
        .map(result -> result ? "User exist" : "User doesn't exist")
        .subscribe(message -> display(message));

我使用Rx2但是使用Rx1邏輯是相同的。

我還使用了Single而不是Observable,因為你只等待一個值。 興趣是你的功能更具表現力的合同。

您不能代表Observable發出值,即調用類似myObservable.send(value)的值。 第一種解決方案是使用主題 另一個解決方案(上面的解決方案)是使用Observable.create()(或Single.create())創建observable。 你調用回調方法並在方法Observable.create()中創建監聽器,因為它在Observable.create()內部,你可以調用onSuccess()方法,該方法告訴Observable傳遞一個值。

這是我用來將回調包裝成可觀察的東西。 起初有點復雜,但很容易適應。

我問你另一個例子。 假設您要將EditText的更改顯示為Snackbar:

View rootView;
EditText editTextView;

//Wrap Android addTextChangedListener into an Observable
Observable<String> textObservable = Observable.create(consumer ->
        editTextView.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                consumer.onNext(s.toString());
            }
        })
);

//Use it
textObservable.subscribe(text -> Snackbar.make(rootView, text, Snackbar.LENGTH_SHORT).show());
Maybe.<String>create(new MaybeOnSubscribe<String>() {
      @Override
      public void subscribe(MaybeEmitter<String> e) throws Exception {
        OnSuccessListener(uri->{
          e.onSuccess(uri));
        })
        .addOnFailureListener(throwable -> {
          e.onError(throwable);
        });
      }
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM