@RitcheeQinG
2020-03-23T08:52:45.000000Z
字数 1217
阅读 346
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() {@Overridepublic 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() {@Overridepublic void doFrame(long frameTimeNanos) {elapsed = 0;processJobs();}});}}private static void onNextFrame(Choreographer.FrameCallback callback) {Choreographer.getInstance().postFrameCallback(callback);}}