@RitcheeQinG
2020-03-23T08:52:45.000000Z
字数 1217
阅读 289
Android
Reference
看到有老外提出来的,作用是记录当前一帧进行的操作所花费的时间,如果不够进行下一个操作,则将下一个操作放到下一帧,以此来增加画面的流畅度。
源代码是kotlin编写的,尝试改成了java
import android.os.Handler;
import android.view.Choreographer;
import java.util.ArrayDeque;
import java.util.concurrent.Callable;
public class UIJobScheduler {
private final static float MAX_JOB_TIMES_MS = 4f;
private static long elapsed = 0L;
private static ArrayDeque<Callable> jobQueue = new ArrayDeque<>();
private static Handler handler = new Handler();
private static boolean isOverMaxtime() {
return elapsed > MAX_JOB_TIMES_MS * 1_000_000;
}
public static void submitJob(final Callable job) {
jobQueue.add(job);
if (jobQueue.size() == 1) {
handler.post(new Runnable() {
@Override
public void run() {
processJobs();
}
});
}
}
private static void processJobs() {
while (!jobQueue.isEmpty() && !isOverMaxtime()) {
long start = System.nanoTime();
Callable currentJob = jobQueue.poll();
if (currentJob != null) {
try {
currentJob.call();
} catch (Exception e) {
e.printStackTrace();
}
}
elapsed += System.nanoTime() - start;
}
if (jobQueue.isEmpty()) {
elapsed = 0;
} else {
onNextFrame(new Choreographer.FrameCallback() {
@Override
public void doFrame(long frameTimeNanos) {
elapsed = 0;
processJobs();
}
});
}
}
private static void onNextFrame(Choreographer.FrameCallback callback) {
Choreographer.getInstance().postFrameCallback(callback);
}
}