【问题标题】:Prevent multiple calls to Android Service OnStart() from Start() -ing same Thread over again (Xamarin)防止从 Start() 多次调用 Android Service OnStart() - 再次调用同一线程(Xamarin)
【发布时间】:2017-08-24 12:56:44
【问题描述】:

代码示例来自一个应用程序,该应用程序使用服务在专用于该服务的线程上执行一些任务。当 Android 设备改变方向并且 MainActivity 重新创建自己时,它会再次调用 Service 的 OnCreate(),这反过来又会创建另一个线程。该线程旨在无限运行,这会创建多个线程,从而导致问题。

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

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

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

我已尝试将其设为全局,但编译器不同意无限循环:

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

我尝试了很多东西,但我完全没有想法。我想我应该得到一些帮助。

【问题讨论】:

  • 您是否尝试过使用应用程序变量来查看服务是否正在运行?
  • @JordyDieltjens 你能告诉我如何检查这个吗?
  • 在我的回答中,我展示了如何创建应用程序变量以及如何使用它。但我认为York Shen 他的回答比我的好很多

标签: android multithreading xamarin service


【解决方案1】:

当 Android 设备改变方向并且 MainActivity 重新创建自己时,它会再次调用 Service 的 OnCreate()

像这样添加ConfigurationChanges属性:

ConfigurationChanges = ConfigChanges.Orientation|ConfigChanges.ScreenSize

您可以阻止在设备改变方向时重新创建Activity,然后您的ServiceOnCreate() 将不会再次被调用。

【讨论】:

    【解决方案2】:

    我的想法是使用全局布尔值来检查服务是否已经启动:

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

    【讨论】:

    • 我必须道歉,但我的问题是由于另一个因素造成的。我发现这两个建议都是正确的,但我会采用这个解决方案,因为它更具体地解决了问题,并且可能有助于其他情况下的线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多