如何同时启动和运行两个后台服务?
Posted
技术标签:
【中文标题】如何同时启动和运行两个后台服务?【英文标题】:How to start and run two background services at the same time? 【发布时间】:2018-08-09 05:34:43 【问题描述】:我想点击“开始”按钮,以便应用程序可以同时启动和运行两个服务。
我创建了两个名为ServiceA
和ServiceB
的服务。对于每项服务,我已经
创建了一个可运行的方法(在 onStartCommand
中)来逃避 ANR 问题。我还创建了一个开始按钮,这样当我点击开始按钮时,我希望ServiceA
和ServiceB
可以同时开始,或者说同步。
我尝试了很多方法。第一次尝试只是一个一个地启动服务,但是失败了:
startButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Intent intent1 = new Intent(MainActivity.this, ServiceA.class);
startService(intent1);
Intent intent2 = new Intent(MainActivity.this, ServiceB.class);
startService(intent2);
);
然后我打算尝试AsyncTask
,但是由于服务是在后台使用处理程序运行的,如果我使用AsyncTask
,它将创建另一个后台处理程序,这是不适用的。您有什么建议可以一键同时运行两个服务吗?
【问题讨论】:
不是。如果只有一个处理器,它一次只能执行一项任务。如果有多个处理器......也许你可以使用它,但不确定如何(或为什么)。两者启动时间很短,有什么问题?exactly the same time
你绝对不能期待这个。
您好 Stultuske 先生,问题是我尝试使用上述方式,但它只会运行 serviceA,我希望将 serviceA 和 serviceB 放在一次点击事件中,我认为这可能与线程同步问题,但由于我在android开发方面的经验有限,我不知道任何解决方案,是否可以使用executeOnexecuter来完成这项工作?感谢您的 cmets
【参考方案1】:
您需要研究 Java 并发和多线程。如果你想并行运行这两种方法,你必须使用线程...
Thread thread1 = new Thread(new Runnable()
@Override
public void run()
codeHereWillRunConcurrentlyWithMainThread();
);
thread1.start();
Thread thread2 = new Thread(new Runnable()
@Override
public void run()
codeHereWillAlsoRunConcurrentlyWithMainThread();
);
thread2.start();
但是,如果您的两个线程应该一起工作,您需要查看如何使用 java 内置的“同步”关键字。它用于防止多线程并发环境中的死锁,并防止变量/变量在其他线程对所述变量/变量进行操作时被修改。
更多信息: https://docs.oracle.com/javase/tutorial/essential/concurrency/ http://winterbe.com/posts/2015/04/07/java8-concurrency-tutorial-thread-executor-examples/ http://www.vogella.com/tutorials/JavaConcurrency/article.html
【讨论】:
嗨,乔 D,感谢您的回答。问题是 serviceA 用于收集智能手机上的传感器数据,serviceB 用于收集智能手机附近的 BLE 设备,所以我必须将这两个服务组合成一个单击事件,以便我可以同时收集传感器数据和 BLE 设备最后,我也考虑使用 Asynctask executeOnexecutor 来完成这项工作,但由于我对 android studio 的体验不佳,我不确定它是否有效。或者如果您对此有更多建议?最后,真的很感谢你的好意帮助!!! 不是问题人。您肯定在寻找异步调用。尝试异步任务。或者类似地,将线程中的方法同步到一个变量,该变量将它们锁定在当前线程。以上是关于如何同时启动和运行两个后台服务?的主要内容,如果未能解决你的问题,请参考以下文章