我正在创建一个 PhoneGap 应用,当应用处于有效状态时,该应用会跟踪用户的当前位置并将其显示在地图上。
当应用启动时,我会使用setInterval
上的navigator.geolocation.getCurrentPosition
开始跟踪该位置。当我收到暂停事件时,该间隔被清除。当我收到 resume 事件时,我再次致电setInterval
。
此外,在收到 resume 事件时,我需要向服务器发送一个Ajax请求,以查看应用程序在后台时是否发生了任何有趣的事情,并且可能会显示一个新屏幕结果是信息。
有时,几乎从不在我的手机上,但更频繁地在测试仪的手机上,简历花费了太多时间,应用程序被iOS杀死:
Code Type: ARM (Native)
Parent Process: launchd [1]
Date/Time: 2013-05-29 09:26:54.352 +0200
OS Version: iOS 6.1.4 (10B350)
Report Version: 104
Exception Type: 00000020
Exception Codes: 0x000000008badf00d
Highlighted Thread: 0
Application Specific Information:
com.x failed to resume in time
Elapsed total CPU time (seconds): 10.590 (user 10.590, system 0.000), 53% CPU
Elapsed application CPU time (seconds): 9.821, 49% CPU
以下伪代码显示了我如何连接应用程序:
(function app() {
function init() {
// Init app
// ...
startGPS();
checkState();
}
function checkState() {
// Make Ajax request to server and compare with local state
// and decide which screen to show
// ...
}
function startGPS() {
// use setInterval on navigator.geolocation.getCurrentPosition
// ...
}
function stopGPS() {
// clear the interval from startGPS()
// ...
}
// Other functions
// ...
on('pause', stopGPS);
on('resume', startGPS)
on('resume', checkState);
on('deviceready', init);
})();
我,或许是天真地,相信由于Ajax调用和getCurrentPosition
调用都是异步的,我不会锁定渲染,应用程序可以及时恢复,但似乎不是就是这样。我还尝试将{em> resume 代码包装在setTimeout
中,但结果相同。
在没有及时恢复的情况下,实现这一目标的更好方法是什么?
我正在使用PhoneGap 2.7
答案 0 :(得分:0)
您可以尝试同步运行startGPS()和checkState()函数,方法是在调用另一个之前等待一个函数返回。尝试两种方式,因为这两个函数中的一个可能是锤击CPU导致您的应用程序被杀:
function startGPS() {
// use setInterval on navigator.geolocation.getCurrentPosition
}
function checkState(){
$.ajax({
url: someurl,
success: function(){
// Make Ajax request to server and compare with local state
startGPS();
}
});
}
on('resume', checkState);
或
function startGPS() {
var firstCall = true;
setInterval(function(){
navigator.geolocation.getCurrentPosition(function(position){
// do some stuff with position...
if(firstCall){
firstCall = false;
checkState(); // check state after first successful position is returned
}
});
}, someInterval);
}
function checkState(){
// Make Ajax request to server and compare with local state
}
on('resume', startGPS);