2017-08-06 146 views
7

我有一個應用程序,每分鐘啓動並運行數據庫的後臺檢查。以下是此代碼。如何在我的應用程序中正確運行定時過程,將在應用程序正在使用或在後臺停止時開始停止?

我得到了我認爲是內存泄漏的問題,並且正在查看循環代碼的所有區域。

有沒有可能這個代碼可以留在循環狀態,並有助於內存泄漏,或者是onSleep和onResume編碼100%可靠的方式來正確停止和啓動計時器循環的方式?

請注意,我只想讓代碼的定時部分在應用程序正在使用時在前臺運行一分鐘。

namespace Japanese 
{ 
    public partial class App : Application 
    { 

     private static Stopwatch stopWatch = new Stopwatch(); 

     public App() 
     { 
      InitializeComponent(); 
      MainPage = new Japanese.MainPage(); 
     } 

     protected override void OnStart() 
     { 
      App.DB.InitData(); 

      if (!stopWatch.IsRunning) 
       stopWatch.Start(); 

      Device.StartTimer(new TimeSpan(0, 0, 1),() => 
      { 
       if (stopWatch.IsRunning && stopWatch.Elapsed.Minutes >= defaultTimespan) 
       { 
        Debug.WriteLine("Checking database"); 
        PointChecker.CheckScore(); 
        stopWatch.Restart(); 
       } 
       return true; 
      }); 
     } 

     protected override void OnSleep() 
     { 
      stopWatch.Reset(); 
     } 

     protected override void OnResume() 
     { 
      stopWatch.Start(); 
     } 

    } 
} 
+0

您需要停止由Device.StartTimer啓動的計時器。爲什麼你使用秒錶呢? –

+1

儘管我不清楚使用計時器和秒錶的設計,但除PointChecker.CheckScore之外,沒有看到任何可能導致內存泄漏的內容。我跑了一小時,並保持運行 –

+1

當你關閉在iOS上的應用程序,這將不再運行。你的應用程序可以嗎?我認爲你應該閱讀這個[論壇帖子](https://forums.xamarin.com/discussion/11939/run-background-task-every-x-amount-of-time)關於後臺任務 – Harry

回答

3

App類是代表跨平臺移動應用程序的類,它在運行甚至你「的MainPage」沒有,所以我覺得你需要使用OnAppearingOnDisappearing方法在您的主頁(一:ContentPage)。

也許是這樣的:

protected override void OnAppearing() 
{ 
    stopWatch.Start(); 
    base.OnAppearing(); 
} 

,並

protected override void OnDisappearing() 
{ 
stopWatch.Reset(); 
base.OnDisappearing(); 
} 

我希望幫助, 馬布魯克。

相關問題