不间断运行服务 - Thread,AsyncTask还是Executor?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不间断运行服务 - Thread,AsyncTask还是Executor?相关的知识,希望对你有一定的参考价值。

我正在编写一个应该从网站获取一些值的应用程序,并在某些条件成立时通知。为此,我创建了一个服务,应该不停地运行并启动警报。

在服务文档中,它说:

请注意,服务与其他应用程序对象一样,在其托管进程的主线程中运行。这意味着,如果您的服务要进行任何CPU密集型(例如MP3播放)或阻止(例如网络)操作,它应该生成自己的线程来执行该工作。

因此,我目前正在服务的onStartCommand()中创建一个新线程,其中包含要运行的代码。一些网络动作正在做另一个类,我正在创建另一个线程。这是一个好习惯吗?

在AsyncTask的文档中,它说:

如果需要保持线程长时间运行,强烈建议您使用java.util.concurrent包提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask。

是否可以使用其中一个命名的API?

这是我目前使用的代码的摘录:

public class MyService extends Service {
private MyClass x = new MyClass();

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {

            tWorker = new Thread(new Runnable() {
            @Override
            public void run() {
               while(!tWorker.isInterrupted()) { 
                    if(x.alarm()) { //action here }
               }
            });
            tWorker.start();
    }
}


public clas MyClass{
   public boolean alarm(){
      //get html, extract value and return true or false in a new thread
   }
}



这种做法是否可以推荐或更好地使用其他选项?

编辑:对于我的使用情况,我应该选择哪一个命名的API?

答案

是的,最佳做法是使用文档中所述的API。使用Java的线程系统可能会因为多种原因导致android出现问题,例如杀死后台进程等的应用程序。您的线程可能最终会停止运行。使用Android特定类只是不那么麻烦,因为它们旨在处理Android设备上发生的所有事情。

以上是关于不间断运行服务 - Thread,AsyncTask还是Executor?的主要内容,如果未能解决你的问题,请参考以下文章

LNMP架构部署

事件 7026,Service Control Manager 下列引导或系统启动驱动程序无法加载: bootsafe。玩LOL不间断的重启

如何管理不间断运行的线程

不间断的 cronjob

nginx不间断服务平滑升级

Android不间断上报位置信息-应用进程防杀指南