2017-08-24 40 views
0

代碼示例來自使用服務在專用於該服務的線程上執行某些任務的應用程序。當Android設備改變方向並且MainActivity重新創建時,它會再次調用服務的OnCreate(),這又會創建另一個線程。該線程意味着無限運行,這會創建多個導致問題的線程。防止多次調用Android服務OnStart()從開始() - 再次使用相同的線程(Xamarin)

public class myService: Service 
{ 
    Java.Lang.Thread serviceThread; 

    public override OnCreate() 
    { 
     serviceThread = new Java.Lang.Thread(infiniteLoop); 

     if(serviceThread.GetState != "RUNNABLE") 
     { 
      serviceThread.Start(); 
     } 
    } 
} 

我試圖讓這個全球性,但編譯器與infiniteLoop不同意:

Java.Lang.Thread serviceThread = new Java.Lang.Thread(infiniteLoop); 

我已經嘗試了很多事情,但我完全江郎才盡。以爲我應該得到一些幫助。

+0

您是否嘗試過使用應用程序變量來查看服務是否正在運行? –

+0

@JordyDieltjens你能告訴我如何檢查這個嗎? – NikosD

+0

在我的回答中,我展示瞭如何創建應用程序變量以及如何使用它。但我認爲約克沉他的回答比我的好很多 –

回答

1

我的想法是一個全球性的布爾或檢查服務是否已經開始不:

public static class GlobalVariables 
{ 
    public static bool ThreadStarted; 
    static GlobalVariables() 
     { 
     ThreadStarted=false; 

     } 


} 

而不是在您的onCreate:

public class myService: Service 
{ 
    Java.Lang.Thread serviceThread; 

    public override OnCreate() 
    { 
     serviceThread = new Java.Lang.Thread(infiniteLoop); 

     if(serviceThread.GetState != "RUNNABLE" && !GlobalVariables.ThreadStarted) 
     { 
GlobalVariables.ThreadStarted = true; 
      serviceThread.Start(); 
     } 
    } 
} 
+0

我不得不道歉,但我的問題是由於另一個因素。我發現這兩個建議都是正確的,但我會採用這個解決方案,因爲它更具體的問題,並可能有助於其他情況下的線程。 – NikosD

2

當Android設備改變方向和MainActivity重新創建它自己再次調用服務的OnCreate()

添加ConfigurationChanges屬性是這樣的:

ConfigurationChanges = ConfigChanges.Orientation|ConfigChanges.ScreenSize 

您可以防止Activity當設備改變方向重新創建,那麼你ServiceOnCreate()不會成爲再打電話。