2

アプリ自体が表示されていなくても、バックグラウンドで定期的に (頻繁に) 何らかの作業を行う必要があるアプリを開発しています。VOIPアプリとして宣言することで、起動し、10分(600秒)後に自動的に再起動することさえできました。このアプリは 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 に答える