如何同时启动和运行两个背景服务



我想单击'start'按钮,以便应用程序可以同时启动和运行两个服务。我创建了两个名为ServiceAServiceB的服务。对于每种服务,我创建了一个可运行的方法(在onStartCommand中(以避免ANR问题。我还创建了一个启动按钮,因此当我单击"开始"按钮时,我希望ServiceAServiceB可以完全同时启动,换句话说,同步。

我尝试了多种方法。第一次尝试只是一个一个一个启动服务,但失败了:

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,它将创建另一个不适用的后台处理程序。您是否有任何建议可以同时单击一个按钮?

您需要研究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-tutorial-thread-executor-examples/http://www.vogella.com/tutorials/javaconcurrency/article.html

最新更新