我正在开发一个应用程序,需要定期(经常)在后台进行一些工作,即使应用程序本身没有显示。我已经启动它,甚至在10分钟(600秒)后自动重启,宣布它为VOIP应用程序。该应用程序不适用于App Store。
大约300-400秒后,系统会生成一个新线程(正确),但它不会关闭最后一个线程。这意味着每600秒产生一个新线程,增加了我的应用程序的内存和电池消耗。不好。
关于如何在创建新线程后关闭第一个衍生线程的任何线索?
此应用程序关闭后,此代码将启动后台处理程序。它还定期启动一个600s间隔的新处理程序
- (void)applicationDidEnterBackground:(UIApplication *)application
{
isInBackground = YES;
BOOL backgroundAccepted = [[UIApplication sharedApplication]
setKeepAliveTimeout:600 handler:^{ [self startBackgroundHandler]; }];
if (backgroundAccepted)
{
NSLog(@"VOIP backgrounding accepted");
}
[self startBackgroundHandler];
}
此代码启动一个定期执行某些工作的线程(每个5s):
- (void)startBackgroundHandler
{
UIApplication* app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
while (1)
{
NSLog(@"BGTime left: %f", [UIApplication
sharedApplication].backgroundTimeRemaining);
sleep(5);
}
});
}
答案 0 :(得分:0)
一段时间以来一直在努力解决这个问题,但在Stackoverflow上写完之后就找到了解决方案。
刚刚更换
while (1)
与
int localThreadId = ++threadId;
while (threadId == localThreadId)
其中线程id是int。因此,当新线程启动时,threadId会增加,而旧的线程会停止。