2

我正在开发一个需要定期(经常)在后台做一些工作的应用程序,即使应用程序本身没有显示。我已经启动它,甚至在 10 分钟(600 秒)后通过将其声明为 VOIP 应用程序自动重启。该应用程序不适用于 App Store。

大约 300-400 秒后,系统会生成一个新线程(正确),但不会关闭最后一个线程。这意味着大约每 600 秒产生一个新线程,从而增加了我的应用程序的内存和电池消耗。不好。

那么,一旦创建了新线程,关于如何关闭第一个衍生线程的任何线索?

一旦应用程序关闭,此代码将启动后台处理程序。它还定期以 600 秒的间隔启动一个新的处理程序

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    isInBackground = YES;
    BOOL backgroundAccepted = [[UIApplication sharedApplication]
        setKeepAliveTimeout:600 handler:^{ [self startBackgroundHandler]; }];
    if (backgroundAccepted)
    {
        NSLog(@"VOIP backgrounding accepted");
    }
    [self startBackgroundHandler];
}

此代码启动一个线程,该线程定期执行一些工作(每 5 秒):

- (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);
        }
    });
}
4

1 回答 1

0

一段时间以来一直在为此苦苦挣扎,但在 Stackoverflow 上写到这里后就想出了一个解决方案。

刚换

while (1)

int localThreadId = ++threadId;
while (threadId == localThreadId)

其中线程 id 是一个 int。因此,当一个新线程启动时,threadId 增加而旧线程停止。

于 2013-01-09T09:23:23.963 回答