Files
NativeScript/timer/timer.android.ts
Hristo Deshev 437e220c42 Zone-aware versions of certain APIs: setTimeout/setInterval mostly.
Instead of waiting for zone.js to patch our global declarations and break
the lazy module loading optimizations there, we'll let it patch stuff
before "globals" gets loaded, so that it doesn't touch (and break) the code
there.

Of course, that requires that functions that need legit patching need to be
made aware of the zone, or get patched later on. The global.zonedCallback
function makes that easy, and we use it for setTimeout/setInterval.
2016-03-31 18:29:42 +03:00

71 lines
1.6 KiB
TypeScript

/**
* Android specific timer functions implementation.
*/
var timeoutHandler;
var timeoutCallbacks = {};
var timerId = 0;
function createHandlerAndGetId(): number {
if (!timeoutHandler) {
timeoutHandler = new android.os.Handler(android.os.Looper.getMainLooper());
}
timerId++;
return timerId;
}
export function setTimeout(callback: Function, milliseconds = 0): number {
const id = createHandlerAndGetId();
const zoneBound = zonedCallback(callback);
var runnable = new java.lang.Runnable({
run: () => {
zoneBound();
if (timeoutCallbacks[id]) {
delete timeoutCallbacks[id];
}
}
});
if (!timeoutCallbacks[id]) {
timeoutCallbacks[id] = runnable;
}
timeoutHandler.postDelayed(runnable, long(milliseconds));
return id;
}
export function clearTimeout(id: number): void {
if (timeoutCallbacks[id]) {
timeoutHandler.removeCallbacks(timeoutCallbacks[id]);
delete timeoutCallbacks[id];
}
}
export function setInterval(callback: Function, milliseconds = 0): number {
const id = createHandlerAndGetId();
const handler = timeoutHandler;
const zoneBound = zonedCallback(callback);
var runnable = new java.lang.Runnable({
run: () => {
zoneBound();
if (timeoutCallbacks[id]) {
handler.postDelayed(runnable, long(milliseconds));
}
}
});
if (!timeoutCallbacks[id]) {
timeoutCallbacks[id] = runnable;
}
timeoutHandler.postDelayed(runnable, long(milliseconds));
return id;
}
export var clearInterval = clearTimeout;