异步编程:JDeferred 2.x 的使用(针对Android)
本庫(kù)的地址:https://github.com/jdeferred/jdeferred
依賴方法:
這個(gè)庫(kù)是流式思想的實(shí)踐,類同于rxjava,但更加簡(jiǎn)單(當(dāng)然功能也沒(méi)有rxjava強(qiáng)大)
1,核心promise的方法:
// 萬(wàn)能方法:可以傳入DoneCallback, FailCallback, ProgressCallback, DoneFilter, then() ? // 如下回調(diào) 返回 promise (FailFilter, ProgressFilter, DonePipe, FailPipe, ProgressPipe) done() //完成回調(diào) fail() //失敗回調(diào) progress() //進(jìn)度回調(diào) always() //無(wú)論什么結(jié)果都會(huì)回調(diào)2,DeferredObject
Deferred deferred = new DeferredObject(); deferred.resolve("成功了") //需要傳給done的結(jié)果 deferred.reject("失敗了")//需要傳給fail的結(jié)果 deferred.notify(100)//需要傳給progress的結(jié)果 // 實(shí)現(xiàn)了promise接口,可以調(diào)用promise內(nèi)的方法3,DeferredManager
//默認(rèn)的ExecutorService是Executors.newCachedThreadPool(); DeferredManager dm = new DefaultDeferredManager(); DeferredManager dm = new DefaultDeferredManager(executorService); //針對(duì)android,AndroidDeferredManager 繼承了DefaultDeferredManager AndroidDeferredManager dm = new AndroidDeferredManager();核心方法:dm.when(params)
params有以下幾種方式:
Callable, Runnable, Future,?
DeferredRunnable, DeferredCallable, DeferredFutureTask,
DeferredAsyncTask
(中三種是上三種的子類,內(nèi)部持有一個(gè)DeferredObject,上三種傳入后也會(huì)被封裝為DeferredFutureTask,內(nèi)部持有一個(gè)DeferredObject)
(DeferredFutureTask繼承于FutureTask(實(shí)現(xiàn)Runnable\Future,并持有Callable))
(DeferredAsyncTask繼承與AsyncTask,是android特有的,內(nèi)部持有一個(gè)DeferredObject)
4,支持同步和異步
a,同步的使用:
Deferred deferred = new DeferredObject();
Promise promise = deferred.promise();
promise.done(new DoneCallback() {public void onDone(Object result) {...}
}).fail(new FailCallback() {public void onFail(Object rejection) {...}
}).progress(new ProgressCallback() {public void onProgress(Object progress) {...}
}).always(new AlwaysCallback() {public void onAlways(State state, Object result, Object rejection) {...}
});deferred.resolve("done");
deferred.reject("oops");
deferred.notify("100%");
原理:DeferredObject內(nèi)部持有一個(gè)promise,當(dāng)調(diào)用resolve()時(shí),回調(diào)promise.done();調(diào)用reject()時(shí),回調(diào)promise.fail()..以此類推
或者
DeferredManager dm = new DefaultDeferredManager(); Promise p1, p2, p3; // initialize p1, p2, p3 dm.when(p1, p2, p3).done(…).fail(…)原理:DeferredManager內(nèi)部對(duì)promise的返回做了原子性處理,保證了線程安全
b,異步的使用:
三種用法:
第一種:線程中使用deferred
final Deferred deferred = ... Promise promise = deferred.promise(); promise.then(…); Runnable r = new Runnable() {public void run() {while (…) {deferred.notify(myProgress);}deferred.resolve("done");} }第二種:使用DeferredManager 和DeferredRunnable
DeferredManager dm = …; dm.when(new DeferredRunnable<Double>(){public void run() {while (…) {notify(myProgress);}} }).then(…);第三種:使用AndroidDeferredManager(內(nèi)部封裝了AsyncTask和handler)
AndroidDeferredManager dm = new AndroidDeferredManager(); dm.when(new DeferredAsyncTask<Void, Progress, Result>(){@Overrideprotected Object doInBackgroundSafe(Void... voids) throws Exception {return null;} }).then(...);使用案例:
VUiKit.defer().when(() -> {// 主要操作,比如寫(xiě)入數(shù)據(jù)庫(kù)等。}).then((v) -> {// 操作完成}).fail((err) -> {// 操作失敗Log.e(TAG,err);}); /** * 簡(jiǎn)單封裝一下調(diào)用方式 */ public class VUiKit {private static final AndroidDeferredManager gDM = new AndroidDeferredManager();private static final Handler gUiHandler = new Handler(Looper.getMainLooper());public static AndroidDeferredManager defer() {return gDM;}public static int dpToPx(Context context, int dp) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,context.getResources().getDisplayMetrics());}public static void post(Runnable r) {gUiHandler.post(r);}public static void postDelayed(long delay, Runnable r) {gUiHandler.postDelayed(r, delay);}public static void sleep(long time) {try {Thread.sleep(time);} catch (InterruptedException e) {e.printStackTrace();}} }贈(zèng)送源碼:https://github.com/yugu88/MagicWX。
《最完整的Android逆向知識(shí)體系》
總結(jié)
以上是生活随笔為你收集整理的异步编程:JDeferred 2.x 的使用(针对Android)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android开发万能Utils(工具大
- 下一篇: Android面向切面编程框架(Aspe