前面说到了 在 TaskScheduler中可能包含3个链表。
然后我们继续看TaskScheduler的子类 BasicTaskScheduler就可以到里面有一个这个成员变量:
DelayQueue |
fDelayQueue就是我们前面说的其中一个链表,这个链表是跟DelayedTask相关的。
然后我们来继续看DelayQueue这个链表类,它的节点是DelayQueueEntry。这是一个双向、循环列表,所以每个节点必须包含其前后节点的指针。
在源码里面DelayQueueEntry的结构是这样的:
private:
friend class DelayQueue;
DelayQueueEntry* fNext;
DelayQueueEntry* fPrev;
DelayInterval fDeltaTimeRemaining;
long fToken;
staitc long tokenCounter;
public:
virtual void handleTimeOut();
这个节点里面内容有2个:
fDeltaTimeRemaining,这是一个跟时间相关的类,在这里我们完全可以把它当成一个long型数据。
fToken,则可以看作是一个标识码,不同的DelayQueueEntry对应不同的数字,它是通过tokenCounter对它赋值的。
然后里面有个函数 handleTimeOut这个函数代表如果 时间到了(fDeltaTimeRemaining==0)或者超时了要进行什么操作,这个操作是由它的子类来完成的。
然后我们再回来看DelayQueue这个链表,它包含一个表头,表头的前后指针都指向自己,fDeltaTimeRemaining为无限大。fToken应该为1.
链表有些操作,不外乎是 添加和删除节点,然后是更新节点。
所以前面说的3个函数:
scheduleDelayedTask
unscheduleDelayedTask
rescheduleDelayedTask
就是添加和删除链表的节点了,淡然这里面节点不是基类DelayQueueEntry而是它的子类: AlarmHandler,这个类主要重写了handleTimeOut这个函数,在这个函数里面表明如果超时了 就执行一个对应的函数,函数以及函数的参数由scheduleDelayedTask的参数给出。