iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0

前言

在使用 RxJava 前首先要先理解它的運作原理就是,增開另一個線程使你不會因資料量的問題而卡在一個頁面不能做其他的事情

解釋

在解釋線程前須先了解異步與同步的差異。

異步:當要處理復數以上的事件時可以同時執行
同步:一定要處理完當前的事件才會繼續
https://ithelp.ithome.com.tw/upload/images/20200916/20129418uVXAT7qz2H.png
https://ithelp.ithome.com.tw/upload/images/20200916/20129418XXGUy9siMA.png
RxJava 你可以把它想像成一個遊樂園的入口,資料是遊客,售票地是被觀察著,而入口處是觀察著,當今天賣出一張票時被觀察著就會說有一個客人買票了即為 onNext ,所以onNext就可以有無限多個,可是當今天售票處發現遊樂園人數滿了就跟入口處說不能再讓人進去了即為 onComplete,所以當今天就算售票處在賣票給別人時,入口處也不會再讓任何人進去了。

操作

第一步:添加需要使用的套件到build.dradle

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

第二步:創建一個遊樂園的入口處,即為觀察著

Observer<String> observer = new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(String customer) {
                Log.d("TAG", "第: " + customer + "位客人");
            }
            @Override
            public void onError(Throwable e) {
                Log.d("TAG", e.getMessage());
            }

            @Override
            public void onComplete() {
                Log.d("TAG", "full");
            }
        };

第三步:創建售票處,即為被觀察著

Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                // 使用 ObservableEmitter 來發送訊息
                emitter.onNext("1");
                emitter.onNext("2");
                emitter.onNext("3");
                emitter.onComplete();
                emitter.onNext("4");
                emitter.onNext("5");
            }
        });

第四步:將入口處與售票處做一個傳遞訊號的通道

observable.subscribe(observer);

以下即為所有程式碼合併的樣子 ▼▼▼

package com.example.retrofit;

import androidx.appcompat.app.AppCompatActivity;

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

import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Observer<String> observer = new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(String s) {
                Log.d("TAG", "Item: " + s);
            }
            @Override
            public void onError(Throwable e) {
                Log.d("TAG", e.getMessage());
            }

            @Override
            public void onComplete() {
                Log.d("TAG", "finish");
            }
        };
        Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                // 使用 ObservableEmitter 來發送訊息
                emitter.onNext("1");
                emitter.onNext("2");
                emitter.onNext("3");
                emitter.onComplete();
                emitter.onNext("4");
                emitter.onNext("5");
            }
        });
        observable.subscribe(observer);
    }
}

https://ithelp.ithome.com.tw/upload/images/20200916/20129418Ugmf8n7uJV.png


上一篇
#第12篇:Retrofit 使用(下)
下一篇
#第14篇:RxJava 合併 Retrofit2
系列文
Android的30天學習歷程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言