# RxTask
**Repository Path**: zz_sdu/RxTask
## Basic Information
- **Project Name**: RxTask
- **Description**: 安卓数据同步库,可以避免常见的Handler内存泄漏、子线程混乱问题。可以快速的实现子线程与主线程的交互,以及子线程和activity等的生命周期绑定功能。
- **Primary Language**: Android
- **License**: Not specified
- **Default Branch**: dev
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 2
- **Created**: 2023-04-27
- **Last Updated**: 2023-04-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
RxTask,基于线程池+handler封装工具。从此告别到处创建handler,远离到处创建线程无法管理。
已迁移到Androidx
早期的版本介绍:
[RxTask初版上篇](https://juejin.im/post/5b587651f265da0f783ca731)
[RxTask初版下篇](https://juejin.im/post/5b5f01416fb9a04fae211bb1)
### 更新日志:
2021/11/26 v2.0.0
1、删除使用过于复杂的GroupTask模块,可以使用新的DualManager和RxFollow模块代替。
2、优化部分代码,修改不规范处
[项目地址](https://gitee.com/biyouji/RxTask)
[我的Github](https://github.com/AcgnCodeMonkey)
[我的码云](https://gitee.com/biyouji_admin_admin)
**集成方式: implementation 'com.gitee.biyouji:RxTask:v2.0.0'**
### 初始化
~~~java
//默认初始化,默认初始化后核心线程数为cpu核心数X4
RxExecutor.getInstance().init();
//自定义核心线程数量进行初始化
RxExecutor.getInstance().init(32);
//完全自定义工具线程池
RxExecutor.getInstance().init(ExecutorService);
//关闭log输出,默认为开启
RxExecutor.getInstance().setDebug(false);
~~~
### 如何使用?
#### 场景1
##### 子线程任务,执行完毕结果数据返回给主线程显示
~~~java
RxExecutor.getInstance()
.executeTask(new Task(){
@Override
public void run (Emitter emitter) throws Exception {
super.run(emitter);
//当前为子线程
//模拟子线程任务
Thread.sleep(1000);
//任务结束发送数据到主线程
emitter.next("任务执行结果数据");
}
@Override
public void onNext (String data) {
super.onNext(data);
//当前为主线程
//显示子线程执行结果
textView.setText(data);
}
});
~~~
#### 场景2
##### 子线程任务,不关心任务结果,只关心完成时机
~~~java
RxExecutor.getInstance()
.executeTask(new Task() {
@Override
public void run (Emitter emitter) throws Exception {
super.run(emitter);
//当前为子线程
//模拟子线程任务
Thread.sleep(1000);
//任务结束
}
@Override
public void onFinished () {
super.onFinished();
//当前为主线程
// 执行主线程逻辑
}
});
~~~
#### 场景3
##### 单纯执行一个子线程任务,不关心任务结果,也不需要在任务结束后有任何操作
~~~java
RxExecutor.getInstance()
.executeTask(new Task() {
@Override
public void run (Emitter emitter) throws Exception {
super.run(emitter);
//当前为子线程
//模拟子线程任务
Thread.sleep(1000);
//任务结束
}
});
~~~
#### 场景4
##### 执行一个普通子线程而非task
~~~java
RxExecutor.getInstance()
.executeRunnableTask(new Runnable() {
@Override
public void run () {
//当前为子线程
//模拟子线程任务
Thread.sleep(1000);
//任务结束
}
});
~~~
#### 场景5
##### 执行的任务绑定生命周期,界面销毁后,不再回调
在bindLife方法中完成绑定,生命周期结束后,onFinished和onNext将不会再回调。
~~~java
private RxLifeList mBindLife = new RxLifeList();
private void test(){
RxExecutor.getInstance()
.executeTask(new Task() {
@Override
public void run (Emitter emitter) throws Exception {
super.run(emitter);
//当前为子线程
//模拟子线程任务
Thread.sleep(2000);
//任务结束
}
@Override
public void onNext (String data) {
super.onNext(data);
}
@Override
public void onFinished () {
super.onFinished();
//当前为主线程
// 执行主线程逻辑
}
@Override
public void bindLife (RxLife rxLife) {
super.bindLife(rxLife);
mBindLife.add(rxLife);
}
});
}
@Override
protected void onDestroy () {
if (mBindLife != null) {
mBindLife.onDestroy();
}
super.onDestroy();
}
~~~
#### 场景6
##### 当前处于某个子线程任务中,需要主线程中显示数据
~~~java
//其他子线程中
new Thread(new Runnable() {
@Override
public void run () {
//模拟子线程任务
Thread.sleep(1000);
//切换回主线程进行逻辑
RxExecutor.getInstance()
.executeUiTask(new Task() {
@Override
public void onlyRunUiTask () {
super.onlyRunUiTask();
//执行主线程逻辑
}
});
}
}).start();
~~~
#### 场景7
##### 任务执行失败,进行重试
使用 TaskBuilder.create().setRetryMaxCount(3)传入task构造器即可实现重试功能,方法参数为最大重试次数,传入 TaskRetry.INFINITE可实现无限重试(**通常不建议这么做!**)。
**Task默认配置为失败后不重试**
任务失败后会回调onError方法并返回具体错误,如果没有配置重试,进入onError的Task将结束生命周期,不再回调onFinished或者onNext方法。
~~~java
RxExecutor.getInstance()
.executeTask(new Task(
//配置失败重试
TaskBuilder.create()
.setRetryMaxCount(3)
) {
@Override
public void run (Emitter emitter) throws Exception {
super.run(emitter);
//当前为子线程
//模拟子线程任务
Thread.sleep(1000);
//任务结束
}
@Override
public void onError (Exception e) {
super.onError(e);
//任务出错
}
@Override
public void onFinished () {
super.onFinished();
//当前为主线程
// 执行主线程逻辑
}
});
~~~
##### 多种类型数据结果
一个子线程任务过程中可能产生不同结果或者多个结果,那么可以采用下面的写法(注意使用 emitter.objNext发射数据,用onObjNext接收数据),此方法可以用来控制多种类型或者多个步骤的子线程任务,每种类型或者步骤识别使用code来进行
~~~java
RxExecutor.getInstance()
.executeTask(new Task