Day22 Android - RxJava(Observer+Observable)

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


<<:  予焦啦!附录:旅途拾贝

>>:  [Day22] Vue 3 单元测试 (Unit Testing) - Testing Vuex

在 Linux 上轻松安装 Fcitx 与呒虾米

前言 fctix 这个输入法平台是直接就可从套件管理程序安装呒虾米输入法,我翻了一下资料,fcitx...

Day10:程序码编辑器的实用扩充套件(2)

一、前言   上一篇文章介绍了 VSCode 好用的快捷键,此篇开始介绍其他扩充之实用功能罗。没意外...

[重构倒数第11天] - 如何在 Vue 中写出高效能的网页渲染方式 ?

前言 该系列是为了让看过Vue官方文件或学过Vue但是却不知道怎麽下手去重构现在有的网站而去规画的系...

远端系列-3:如何更新远端数据库的档案?

角色情境 小华一边讲解、一边指导小明如何使用 GitHub 建立远端数据库。 小明认真地遵循小华的指...

进击的软件工程师之路-软件战斗营 第四周

学习进度 第三周的课程内容小考与检讨 游戏专题 JFrame、JPannel、JKernel 游戏主...