多任務(wù)同時(shí)進(jìn)行
問(wèn)題:如果有一個(gè)對(duì)數(shù)據(jù)進(jìn)行權(quán)限檢查的操作,可能有1萬(wàn)條、10萬(wàn)條等等,只寫一個(gè)任務(wù)執(zhí)行它會(huì)花費(fèi)很多時(shí)間,這時(shí)可以考慮分成多個(gè)任務(wù)把數(shù)據(jù)分成多段同時(shí)進(jìn)行?
代碼如下:
public abstract class ParallelTask {
private final static String TAG = "ParallelTask";
public ParallelTask() {
}
public void preExecute(Object... args) {
}
public abstract void async1(); //必須實(shí)現(xiàn)
public void async2() {
}
public void async3() {
}
public void async4() {
}
public void async5() {
}
public void async6() {
}
public void async7() {
}
public void async8() {
}
public void onAllExecute() {
}
public void onUICompleted() { //全部任務(wù)執(zhí)行完成后會(huì)執(zhí)行該方法
}
private Observable uiObs;
/**
* 執(zhí)行并行任務(wù),結(jié)束后切換到UI線程
*/
final public void execute(Object...args) {
preExecute(args);
//最外層,執(zhí)行UI線程
uiObs = Observable.just(null).subscribeOn(AndroidSchedulers.mainThread());
List<String> methods = getOverrideMethods();
int size = methods.size();
String[] ms = methods.toArray(new String[size]);
getParallelObservable(ms)
.observeOn(Schedulers.immediate())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
onAllExecute();
executeOnUICompleted();
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "ParallelTask onError()", e);
}
@Override
public void onNext(String string) {
}
});
}
/**
* 最后切換到UI線程執(zhí)行
*/
private void executeOnUICompleted(){
if(uiObs != null){
uiObs.subscribe(new Action1() {
@Override
public void call(Object o) {
onUICompleted();
}
});
}
uiObs = null;
}
private Observable<String> getParallelObservable(String[] methods) {
return Observable.from(methods).flatMap(new Func1<String, Observable<String>>() {
@Override
public Observable<String> call(String s) {
return Observable.just(s).subscribeOn(Schedulers.io()).map(new Func1<String, String>() {
@Override
public String call(String s) {
if ("async1".equals(s)) {
async1();
} else if ("async2".equals(s)) {
async2();
} else if ("async3".equals(s)) {
async3();
} else if ("async4".equals(s)) {
async4();
} else if ("async5".equals(s)) {
async5();
} else if ("async6".equals(s)) {
async6();
} else if ("async7".equals(s)) {
async7();
} else if ("async8".equals(s)) {
async8();
}
return s;
}
});
}
});
}
/**
* 獲取被重寫的方法
* @return
*/
private List<String> getOverrideMethods() {
List<String> overrideMethods = new ArrayList<>();
Method[] bfs = getClass().getDeclaredMethods();
Method[] afs = ParallelTask.class.getDeclaredMethods();
for (Method bm : bfs) {
for (Method am : afs) {
if (bm.getName().equals(am.getName()) &&
bm.getReturnType().equals(am.getReturnType())) {
Class[] bc = bm.getParameterTypes();
Class[] ac = am.getParameterTypes();
if (bc.length == ac.length) {
boolean isEqual = true;
for (int i = 0; i < bc.length; i++) {
if (!bc[i].equals(ac[i])) {
isEqual = false;
break;
}
}
if (isEqual) {
String name = bm.getName();
overrideMethods.add(name);
}
}
}
}
}
return overrideMethods;
}
}
實(shí)現(xiàn)了ParallelTask抽象類,可以同時(shí)執(zhí)行8個(gè)任務(wù),用戶可以自己增加個(gè)數(shù)。用戶可以創(chuàng)建一個(gè)ParallelTask類,然后實(shí)現(xiàn)async1方法,按照自己的需求實(shí)現(xiàn)其他方法即可。