我正在编写一个应该从网站获取一些值的应用程序,并在某些条件成立时通知。为此,我创建了一个服务,应该不停地运行并启动警报。
在服务文档中,它说:
请注意,服务与其他应用程序对象一样,在其托管进程的主线程中运行。这意味着,如果您的服务要进行任何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设备上发生的所有事情。