Android的postOnAnimation分析

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

转自:http://blog.csdn.net/oujunli/article/details/8571078

Android中绘图中,线程可以使用postOnAnimation函数,用于在系统进行下一次动画操作时,运行当前的线程,postOnAnimation(this):

    public void postOnAnimation(Runnable action) {
        final AttachInfo attachInfo = mAttachInfo;
        if (attachInfo != null) {
            attachInfo.mViewRootImpl.mChoreographer.postCallback(
                    Choreographer.CALLBACK_ANIMATION, action, null);
        } else {
            // Assume that post will succeed later
            ViewRootImpl.getRunQueue().post(action);
        }
    }

只看attachInfo不为空的情况,会执行if里面的语句,可以看到属性的Choreographer,看一下Choreographer的postCallback:

    public void postCallback(int callbackType, Runnable action, Object token) {
        postCallbackDelayed(callbackType, action, token, 0);
    }

postCallbackDelayed: 

   public void postCallbackDelayed(int callbackType,
            Runnable action, Object token, long delayMillis) {
        if (action == null) {
            throw new IllegalArgumentException("action must not be null");
        }
        if (callbackType < 0 || callbackType > CALLBACK_LAST) {
            throw new IllegalArgumentException("callbackType is invalid");
        }

        postCallbackDelayedInternal(callbackType, action, token, delayMillis);
    }

可见最终的实现是在postCallbackDelayedInternal里面,看一下postCallbackDelayedInternal的代码: 

   private void postCallbackDelayedInternal(int callbackType,
            Object action, Object token, long delayMillis) {
        if (DEBUG) {
            Xlog.d(TAG, "PostCallback: type=" + callbackType
                    + ", action=" + action + ", token=" + token
                    + ", delayMillis=" + delayMillis + ",this = " + this);
        }
            synchronized (mLock) {
            final long now = SystemClock.uptimeMillis();
            final long dueTime = now + delayMillis;
            mCallbackQueues[callbackType].addCallbackLocked(dueTime, action, token);

            if (dueTime <= now) {
                scheduleFrameLocked(now);
            } else {
                Message msg = mHandler.obtainMessage(MSG_DO_SCHEDULE_CALLBACK, action);
                msg.arg1 = callbackType;
                msg.setAsynchronous(true);
                mHandler.sendMessageAtTime(msg, dueTime);
            }
        }
    }

可以看到在postCallbackDelayedInternal里,在mCallbackQueues队列里面的callbackType添加一个元素。mCallbackQueues是一个CallbackQueue,从命名里就可以看出现,是一个用于回调的队列,并且是安时间先后顺序排好的,与闹钟原理一样,并且里面有一个CallbackRecord类,记录回调相关的信息。callbackType的类型有三种:CALLBACK_INPUT、CALLBACK_ANIMATION、CALLBACK_TRAVERSAL,这里我们用的是CALLBACK_ANIMATION。在postOnAnimation没有delay,所以只要收到Vsync信号,便立即会被执行 。当有Vsync到来是,会执行doFrame,doFrame里有:

...

        doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos);
        doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos);
        doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos);

doCallbacks里面有如下语句:

...

 callbacks = mCallbackQueues[callbackType].extractDueCallbacksLocked(now);

...

        try {
            for (CallbackRecord c = callbacks; c != null; c = c.next) {
                if (DEBUG) {
                    Xlog.d(TAG, "RunCallback: type=" + callbackType
                            + ", action=" + c.action + ", token=" + c.token
                            + ", latencyMillis=" + (SystemClock.uptimeMillis() - c.dueTime)
                            + ",this = " + this);
               }
                c.run(frameTimeNanos);
            }
        } finally {

...

doCallbacks遍历postCallbackDelayedInternal里面添加的元素,并执行元素里的run函数,整个流程也就跑了一遍。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android内存分析是指通过分析应用程序在运行过程中的内存使用情况,找出内存泄漏、内存溢出等问题,以优化应用程序的性能和稳定性。常用的工具有Android Studio提供的内存分析器和MAT(Memory Analyzer Tool)等。 在进行Android内存分析时,可以采取以下步骤: 1. 监测内存使用:使用Android Studio提供的内存监视工具,观察应用程序在运行过程中的内存使用情况,包括堆内存和非堆内存的使用情况。 2. 寻找内存泄漏:通过观察内存使用情况,查找是否有对象没有被正确释放,从而导致内存泄漏。可以使用内存分析器来分析堆快照,查找对象引用关系,找出不再需要的对象。 3. 优化内存占用:观察哪些对象占用了大量内存,并尝试优化其内存占用。例如,可以考虑使用弱引用或软引用来管理对象,减少不必要的缓存等。 4. 避免内存溢出:注意合理管理大数据集合、避免频繁创建大对象、及时释放不需要的资源等,以避免应用程序因为内存溢出而崩溃。 5. 使用内存分析工具:Android Studio提供了内存分析器,可以帮助开发者分析内存使用情况,找出内存泄漏和优化内存占用。MAT是一款Java堆内存分析工具,也可用于Android内存分析。 通过进行Android内存分析,开发者可以及时发现和解决应用程序的内存问题,提升应用程序的性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值