如何同时启动和运行两个后台服务?

时间:2018-03-01 07:39:16

标签: java android service android-asynctask

我想点击“开始”'按钮,以便应用程序可以同时启动和运行两个服务。 我创建了两个名为ServiceAServiceB的服务。对于每项服务,我都是 创建了一个runnable方法(在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,它将创建另一个后台处理程序,这是不适用的。您是否有任何建议在完全相同的时间点击一个按钮运行两个服务?

1 个答案:

答案 0 :(得分:0)

您需要研究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