[关闭]
@RitcheeQinG 2020-03-23T08:52:45.000000Z 字数 1217 阅读 289

UIJobScheduler

Android


Reference
看到有老外提出来的,作用是记录当前一帧进行的操作所花费的时间,如果不够进行下一个操作,则将下一个操作放到下一帧,以此来增加画面的流畅度。
源代码是kotlin编写的,尝试改成了java

  1. import android.os.Handler;
  2. import android.view.Choreographer;
  3. import java.util.ArrayDeque;
  4. import java.util.concurrent.Callable;
  5. public class UIJobScheduler {
  6. private final static float MAX_JOB_TIMES_MS = 4f;
  7. private static long elapsed = 0L;
  8. private static ArrayDeque<Callable> jobQueue = new ArrayDeque<>();
  9. private static Handler handler = new Handler();
  10. private static boolean isOverMaxtime() {
  11. return elapsed > MAX_JOB_TIMES_MS * 1_000_000;
  12. }
  13. public static void submitJob(final Callable job) {
  14. jobQueue.add(job);
  15. if (jobQueue.size() == 1) {
  16. handler.post(new Runnable() {
  17. @Override
  18. public void run() {
  19. processJobs();
  20. }
  21. });
  22. }
  23. }
  24. private static void processJobs() {
  25. while (!jobQueue.isEmpty() && !isOverMaxtime()) {
  26. long start = System.nanoTime();
  27. Callable currentJob = jobQueue.poll();
  28. if (currentJob != null) {
  29. try {
  30. currentJob.call();
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. elapsed += System.nanoTime() - start;
  36. }
  37. if (jobQueue.isEmpty()) {
  38. elapsed = 0;
  39. } else {
  40. onNextFrame(new Choreographer.FrameCallback() {
  41. @Override
  42. public void doFrame(long frameTimeNanos) {
  43. elapsed = 0;
  44. processJobs();
  45. }
  46. });
  47. }
  48. }
  49. private static void onNextFrame(Choreographer.FrameCallback callback) {
  50. Choreographer.getInstance().postFrameCallback(callback);
  51. }
  52. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注