android基础09-rxjava线程切换与自定义操作符

学习笔记,自用,整理中

摘要:






--------------------------------------------------------------------------------------------------------------------------------------------------

内容:1

/**

* TODO subscribeOn() 源码分析

*/

public class RxJavaThreadSource1extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

        // TODO Hook  IO 传递进去的Hook

        RxJavaPlugins.setIoSchedulerHandler(new Function() {

@Override

public Schedulerapply(Scheduler scheduler)throws Exception {

Log.d(L.TAG, "apply: 全局 监听 scheduler:" +scheduler);

                return scheduler;

            }

});

        // TODO hook 给 IO 初始化

        RxJavaPlugins.setInitIoSchedulerHandler(new Function, Scheduler>() {

@Override

public Schedulerapply(Callable schedulerCallable)throws Exception {

Log.d(L.TAG, "apply: 全局 监听 init scheduler:" +schedulerCallable.call());

                return schedulerCallable.call();

            }

});

        Observable.create(

// 自定义source

                new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter e)throws Exception {

e.onNext("Derry");

                        Log.d(L.TAG, "自定义source: " + Thread.currentThread().getName());

                    }

})

// ObservbaleCreate.subscribeOn

        // TODO 第二步    new IOScheduler ---> 线程池 传递进去

        .subscribeOn(

// TODO 第一步  到底干了什么 ( new IOScheduler ---> 线程池)

                Schedulers.io()// 耗时读取的异步

                // Schedulers.newThread() // 开启新线程

        )

// A线程. subscribe

//  ObservableSubscribeOn.subscribe

        .subscribe(

// 终点

                new Observer() {

@Override

public void onSubscribe(Disposable d) {

Disposable disposable = d;

                        Log.d(L.TAG, "onSubscribe: " +  Thread.currentThread().getName());

                    }

@Override

public void onNext(String s) {

Log.d(L.TAG, "onNext: " + Thread.currentThread().getName());

                    }

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

});

    }

}

--------------------------------------------------------------------------------------------------------------------------------------------------


/**

* TODO ObserveOn() 源码分析

*/

public class RxJavaThreadSource2extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

        new Thread(){

@Override

public void run() {

super.run();

                test();

            }

}.start();

    }

private void test() {

Observable.create(

// 自定义source

                new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter e)throws Exception {

e.onNext("Derry");

                        Log.d(L.TAG, "自定义source: " + Thread.currentThread().getName());

                    }

})

// TODO 第二步骤

                .observeOn(

// TODO 第一步  主线程的Handlnr

                        AndroidSchedulers.mainThread()

)

// subsceOn(1)  // 会显示是这个线程的原因,上一层卡片是被1线程执行

                // subsceOn(2)

// subsceOn(3)

// observeOn(A)

// observeOn(B)

                // observeOn(C) // 终点是被C执行

                // ObservableObserveOn.subscribe

                .subscribe(

// 终点

                        new Observer() {

@Override

public void onSubscribe(Disposable d) {

Log.d(L.TAG, "onSubscribe: " +  Thread.currentThread().getName());

                            }

@Override

public void onNext(String s) {

Log.d(L.TAG, "onNext: " + Thread.currentThread().getName());

                            }

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

});

    }

private void t() {

new Handler(Looper.getMainLooper()) {

@Override

public void handleMessage(@NonNull Message msg) {

super.handleMessage(msg);

                // UI 操作...

            }

};

        new Thread(){

@Override

public void run() {

super.run();

                new Handler(Looper.getMainLooper()) {

@Override

public void handleMessage(@NonNull Message msg) {

super.handleMessage(msg);

                        // UI 操作 ...  百分之百 Ui线程 没有问题

                    }

};

            }

}.start();

      new Handler(new Handler.Callback() {

@Override

public boolean handleMessage(@NonNull Message msg) {

return false;

          }

});

    }

}

--------------------------------------------------------------------------------------------------------------------------

自定义事件

public class RxView {

private final static StringTAG = RxView.class.getSimpleName();

    // 我们自己的操作符 == 函数

    public static Observableclicks(View view) {

return new ViewClickObservable(view);

    }

}

--------------------------------------------------------------------------------------------------------------------------


public class ViewClickObservableextends Observable {

private final Viewview;

    // 事件  第一节课 防抖 事件 没用

    private static final ObjectEVENT =new Object();

    private static ObjectEVENT2;

    public ViewClickObservable(View view) {

this.view = view;

        EVENT2 = view;

    }

@Override

protected void subscribeActual(Observer observer) {

// 可以干自己的

        MyListener myListener =new MyListener(view, observer);

        observer.onSubscribe(myListener);

        this.view.setOnClickListener(myListener);

    }

// 我们的包裹

    static final class MyListenerimplements View.OnClickListener, Disposable {

private final Viewview;

        private Observerobserver;  // 存一份 下一层

        // 原子性,同学们自行看看文章

        // https://www.jianshu.com/p/8a44d4a819bc

// boolean  == AtomicBoolean

        private final AtomicBooleanisDisposable =new AtomicBoolean();

        public MyListener(View view, Observer observer) {

this.view = view;

            this.observer = observer;

        }

@Override

public void onClick(View v) {

if (isDisposed() ==false) {

observer.onNext(EVENT);

            }

}

// 如果用调用了 中断

        @Override

public void dispose() {

// 如果没有中断过,才有资格,  取消view.setOnClickListener(null);

            if (isDisposable.compareAndSet(false, true)) {

// 主线程 很好的中断

                if (Looper.myLooper() == Looper.getMainLooper()) {

view.setOnClickListener(null);

                }else {// 主线程,通过Handler的切换

                    /*new Handler(Looper.getMainLooper()) {

@Override

public void handleMessage(@NonNull Message msg) {

super.handleMessage(msg);

view.setOnClickListener(null);

}

};*/

// HandlerScheduler.scheduleDirect

                    AndroidSchedulers.mainThread().scheduleDirect(new Runnable() {

@Override

public void run() {

view.setOnClickListener(null);

                        }

});

                }

}

}

@Override

public boolean isDisposed() {

return isDisposable.get();

        }

}

}

--------------------------------------------------------------------------------------------------------------------------


public class RxActivityextends AppCompatActivity {

@SuppressLint("CheckResult")

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_rx);

        // 给这个控件做防抖

        Button button = findViewById(R.id.button);

        RxView.clicks(button)

.throttleFirst(2000, TimeUnit.MILLISECONDS)

.subscribe(new Consumer() {

@Override

public void accept(Object o)throws Exception {

Observable.create(new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter e)throws Exception {

e.onNext("Derry");

                            }

})

.subscribe(new Consumer() {

@Override

public void accept(String s)throws Exception {

Log.d(L.TAG, "accept: 终点:" + s);

                            }

});

                    }

});

    }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容