天天看點

RxUtil 一個RxJava實用工具類的集合

RxUtil

​ ​​​​

一個實用的RxJava1工具類庫

如果你使用的是RxJava2,請移步​​RxUtil2​​

關于我

​​​​​ ​​​​​​ 

内容

  • RxBus 支援多事件定義,支援資料攜帶,支援全局和局部的事件訂閱和登出
  • 訂閱池管理
  • 線程排程輔助工具
  • RxBinding 使用工具類
  • RxJava常用方法工具類

1、示範(請star支援)

1.1、RxBus

RxUtil 一個RxJava實用工具類的集合

Demo下載下傳

​​​​

2、如何使用

目前支援主流開發工具AndroidStudio的使用,直接配置build.gradle,增加依賴即可.

2.1、Android Studio導入方法,添加Gradle依賴

先在項目根目錄的 build.gradle 的 repositories 添加:

allprojects {
     repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}      

然後在dependencies添加:

dependencies {
   ...
   implementation 'io.reactivex:rxjava:1.2.9'
   implementation 'io.reactivex:rxandroid:1.2.1'
   implementation 'com.github.xuexiangjys:RxUtil:1.1'
}      

3.1、RxBus使用

3.1.1、事件注冊訂閱

1.使用RxBusUtils.get().onMainThread方法注冊事件,并指定訂閱發生在主線程。

RxBusUtils.get().onMainThread(EventKey.EVENT_HAVE_DATA, new Action1<Event>() {
    @Override
    public void call(Event event) {
        showContent(EventKey.EVENT_HAVE_DATA, event.toString());
    }
});      

2.使用RxBusUtils.get().on方法注冊事件,訂閱所線上程為事件發生線程,也可指定訂閱發生的線程。

RxBusUtils.get().on(EventKey.EVENT_BACK_NORMAL, new Action1<String>() {
    @Override
    public void call(String eventName) {
        final String msg = "事件Key:" + EventKey.EVENT_BACK_NORMAL + "\n   EventName:" + eventName + ", 目前線程狀态: " + Event.getLooperStatus();
        showContent(msg);
    }
});      

3.1.2、事件發送

1.使用RxBusUtils.get().post(Object eventName)發送不帶資料的事件。

RxBusUtils.get().post(EventKey.EVENT_NO_DATA);      

2.使用RxBusUtils.get().post(Object eventName, Object content)發送攜帶資料的事件。

RxBusUtils.get().post(EventKey.EVENT_HAVE_DATA, new Event(EventKey.EVENT_HAVE_DATA, "這裡攜帶的是資料"));
RxBusUtils.get().post(EventKey.EVENT_HAVE_DATA, true);      

3.1.3、事件登出

1.使用RxBusUtils.get().unregisterAll(Object eventName)取消事件的所有訂閱并登出事件。

RxBusUtils.get().unregisterAll(EventKey.EVENT_HAVE_DATA);      

2.使用RxBusUtils.get().unregister(Object eventName, SubscribeInfo subscribeInfo)取消事件的某個指定訂閱。

SubscribeInfo是事件注冊訂閱後傳回的訂閱資訊。如果在取消該訂閱後,該事件如無其他訂閱,便自動登出該事件。

RxBusUtils.get().unregister(EventKey.EVENT_CLEAR, mSubscribeInfo);      

3.2、RxJavaUtils使用

3.2.1、線程任務

1.RxIOTask:在io線程中操作的任務

RxJavaUtils.doInIOThread(new RxIOTask<String>("我是入參123") {
    @Override
    public Void doInIOThread(String s) {
        Log.e(TAG, "[doInIOThread]  " + getLooperStatus() + ", 入參:" + s);
        return null;
    }
});      

2.RxUITask:在UI線程中操作的任務

RxJavaUtils.doInUIThread(new RxUITask<String>("我是入參456") {
    @Override
    public void doInUIThread(String s) {
        Log.e(TAG, "[doInUIThread]  " + getLooperStatus() + ", 入參:" + s);
    }
});      

3.RxAsyncTask:在IO線程中執行耗時操作 執行完成後在UI線程中訂閱的任務。

RxJavaUtils.executeAsyncTask(new RxAsyncTask<String, Integer>("我是入參789") {
    @Override
    public Integer doInIOThread(String s) {
        Log.e(TAG, "[doInIOThread]  " + getLooperStatus() + ", 入參:" + s);
        return 12345;
    }

    @Override
    public void doInUIThread(Integer integer) {
        Log.e(TAG, "[doInUIThread]  " + getLooperStatus() + ", 入參:" + integer);
    }
});      

4.RxIteratorTask:周遊集合或者數組的任務,在IO線程中執行耗時操作 執行完成後在UI線程中訂閱的任務。

RxJavaUtils.executeRxIteratorTask(new RxIteratorTask<String, Integer>(new String[]{"123", "456", "789"}) {
    @Override
    public Integer doInIOThread(String s) {
        RxLog.e("[doInIOThread]" + getLooperStatus() + ", 入參:" + s);
        return Integer.parseInt(s);
    }

    @Override
    public void doInUIThread(Integer integer) {
        RxLog.e("[doInUIThread]  " + getLooperStatus() + ", 入參:" + integer);
    }
});      

3.2.2、訂閱者Subscriber

1.SimpleSubscriber:簡單的訂閱者,已對錯誤進行捕獲處理,并對生命周期進行日志記錄。可設定IExceptionHandler接口自定義錯誤處理,設定ILogger接口自定義日志記錄。

2.ProgressLoadingSubscriber:帶進度條加載的訂閱者,實作IProgressLoader接口可自定義加載方式。

Observable.just("加載完畢!")
    .delay(3, TimeUnit.SECONDS)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new ProgressLoadingSubscriber<String>(mProgressLoader) {
        @Override
        public void onNext(String s) {
            Toast.makeText(RxJavaActivity.this, s, Toast.LENGTH_SHORT).show();
        }
    });      

3.3、SubscriptionPool使用

SubscriptionPool:RxJava的訂閱池

1.增加訂閱:add(@NonNull Object tagName, Subscription m) 或者 add(Subscription m, @NonNull Object tagName)

SubscriptionPool.get().add(RxJavaUtils.polling(5, new Action1() {
    @Override
    public void call(Object o) {
        Toast.makeText(RxJavaActivity.this, "正在監聽", Toast.LENGTH_SHORT).show();
    }
}), "polling");      

2.取消訂閱:remove(@NonNull Object tagName)、remove(@NonNull Object tagName, Subscription m)、removeAll()

SubscriptionPool.get().remove("polling");      

3.4、RxBindingUtils使用

1.setViewClicks:設定點選事件

RxBindingUtils.setViewClicks(mBtnClick, 5, TimeUnit.SECONDS, new Action1<Void>() {
    @Override
    public void call(Void aVoid) {
        toast("觸發點選");
    }
});      

2.setItemClicks:設定條目點選事件

3.5、RxSchedulerUtils使用

  1. 訂閱發生在主線程 ( -> -> main)
.compose(RxSchedulerUtils.<T>_main())      
  1. 訂閱發生在io線程 ( -> -> io)
.compose(RxSchedulerUtils.<T>_io())      
  1. 處理在io線程,訂閱發生在主線程( -> io -> main)
.compose(RxSchedulerUtils.<T>_io_main())      
  1. 處理在io線程,訂閱也發生在io線程( -> io -> io)
.compose(RxSchedulerUtils.<T>_io_io())      

聯系方式

​​​​

微信公衆号