AndroidDeferredManager
jdeferred-android引入了一个DeferredManager名为的新实现AndroidDeferredManager。 AndroidDeferredManager确保在UI线程而不是后台线程中执行回调,以便回调进行UI更新。
另外,回调还可以实现AndroidExecutionScopeable 接口以细粒度控制回调是在UI线程还是在后台线程中执行。
AndroidDeferredManager还支持新DeferredAsyncTask对象。此对象基于Android的AsyncTask。
如果您需要始终在后台线程中执行回调,则可以继续使用DefaultDeferredManager。
//默认的ExecutorService是Executors.newCachedThreadPool();
DeferredManager dm = new DefaultDeferredManager();
DeferredManager dm = new DefaultDeferredManager(executorService);
//针对android,AndroidDeferredManager 继承了DefaultDeferredManager
AndroidDeferredManager dm = new AndroidDeferredManager();
AndroidDeferredManager的核心思想
dm.when(params)
params有以下几种方式:
Callable, Runnable, Future,
DeferredRunnable, DeferredCallable, DeferredFutureTask,
DeferredAsyncTask
中三种是上三种的子类,内部持有一个DeferredObject,上三种传入后也会被封装为DeferredFutureTask,内部持有一个DeferredObject
DeferredFutureTask继承于FutureTask(实现Runnable\Future,并持有Callable)
DeferredAsyncTask继承与AsyncTask,是android特有的,内部持有一个DeferredObject
使用例子
使用AndroidDeferredManager(内部封装了AsyncTask和handler)
AndroidDeferredManager dm = new AndroidDeferredManager();
dm.when(new DeferredAsyncTask<Void, Progress, Result>(){
@Override
protected Object doInBackgroundSafe(Void... voids) throws Exception {
return null;
}
}).then(...);
Promise
Promise<D,F,P>
常用类:DeferredObject, DeferredManager
核心promise的方法:
//万能方法:可以传入DoneCallback, FailCallback, ProgressCallback,
//DoneFilter, FailFilter, ProgressFilter, DonePipe, FailPipe, ProgressPipe, 返回promise
then()
//完成回调
done()
//失败回调
fail()
//进度回调
progress()
//无论什么结果都会回调
always()
使用实战
package com.exmple.asycktestk;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import org.jdeferred.android.AndroidDeferredManager;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AndroidDeferredManager gAm = new AndroidDeferredManager();
gAm.when(() -> {
long time = System.currentTimeMillis();
time = System.currentTimeMillis() - time;
Log.d("111--","hello world.");
});
Log.d("22d--","hello world.");
}
}
执行log:
2020-11-27 20:55:51.582 26984-26984/com.exmple.asycktestk D/lidu---22d--: hello world.
2020-11-27 20:55:51.583 26984-27048/com.exmple.asycktestk D/lidu---111--: hello world.
可以看出是异步执行的。