iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
Mobile Development

Android 新手入門學習系列 第 22

Day22 Android - RxJava(Observer+Observable)

  • 分享至 

  • xImage
  •  

RxJava,又名ReactiveX Java,算是相當有名的一個編程庫,異步、線程交換等是它的特性之一,那麼等等就來提提rxjava中的Observable(被觀察者)與Observe(觀察者),及觀察者模式的部分,首先先進行添加rxjava的依賴。

依賴

    implementation 'io.reactivex.rxjava2:rxjava:2.0.1'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'

被觀察者(Observable)

//建立被觀察者
        Observable observable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {   //ObservableEmitter為信號發送器,此發送String型態資料,也可發送別的
                //向觀察者(Observer)發送信號
                e.onNext("This");
                e.onNext("is");
                e.onNext("a");
                e.onComplete();
                e.onNext("Observable");//已onComplete,不會發送此行信號
            }
        });

觀察者

observer此有四個需要實現的method(onSubscribe、onNext、onError、onComplete),從被觀察者那邊接收信號。

//建立觀察者
        Observer<String> observer = new Observer<String>() {    //傳入String型態資料
            @Override
            public void onSubscribe(Disposable d) { //Disposable可用以解除訂閱(d.dispose())、或查詢是否解除訂閱(d.isDisposed())

            }

            @Override
            public void onNext(String value) {  //改為String型態
                Log.d("observer","onNext:"+value);
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {
                Log.d("observer","onComplete!");
            }
        };
        observable.subscribe(observer); //產生訂閱(subscribe)以結合,Observable->Observer

這大致上就算是觀察者模式了,Observable->產生訂閱->Observer,主要是有一個點要小心,如果發現Observable找不到create方法的話,有可能是import到android.xxx,是要import io.reactivex.xxx,這個點要留意,那麼接著先放上Log的結果和完整程式碼,明天就來使用rxjava線程實作post:


完整程式碼

import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //建立被觀察者
        Observable observable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {   //發送String型態資料,也可發送別的
                //向觀察者(Observer)發送信號
                e.onNext("This");
                e.onNext("is");
                e.onNext("a");
                e.onComplete();
                e.onNext("Observable");//已onComplete,不會發送此行信號
            }
        });
        //建立觀察者
        Observer<String> observer = new Observer<String>() {    //傳入String型態資料
            @Override
            public void onSubscribe(Disposable d) { //Disposable可用以解除訂閱(d.dispose())、或查詢是否解除訂閱(d.isDisposed())

            }

            @Override
            public void onNext(String value) {  //改為String型態
                Log.d("observer","onNext:"+value);
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {
                Log.d("observer","onComplete!");
            }
        };
        observable.subscribe(observer); //產生訂閱(subscribe)以結合,Observable->Observer
    }
}

成果

https://ithelp.ithome.com.tw/upload/images/20210909/20139259j2pBhdlOGi.png


上一篇
Day21 Android - Retrofit(Post)
下一篇
Day23 Android - RxJava+Post
系列文
Android 新手入門學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言