我一直在寻找这里给出的一些答案,但我没有完全解决我的问题:我不想创建一个新类并扩展runnable或thread。
我有一项服务,创建时必须每10秒检查一些东西,并且所需的调用不能从主线程完成,所以onStartCommand()方法我执行以下操作:
mThread = new Thread() {
public void run() {
while(true) {
// some code
try {
Thread.sleep(10000);
}
catch (Exception e){
StringWriter errors = new StringWriter();
e.printStackTrace(new PrintWriter(errors));
Log.i("Exception", errors.toString());
}
}
现在,当我调用onStopService()时,我想停止这个线程。方法stop()已弃用,所以我使用的是interrupt():
@Override
public void onDestroy(){
mDelete.interrupt();
mDownload.interrupt();
super.onDestroy();
}
正如我所料,它会抛出InterruptedException,因为调用interrupt时线程正在休眠。
有没有办法在不创建新类并从runnable或thread扩展的情况下停止线程?
提前致谢
答案 0 :(得分:1)
如您所见[{3}},您可以在线程中使用此代码:
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// We've been interrupted, and returning from the run method will stop your thread.
return;
}
但是,通常最好避免无限循环服务。您应该考虑在工作完成后停止服务,并在需要新工作时重新启动它(使用AlarmManager
)。我不会重复使用代码IntentService
和AlarmManager
,因为Eugen Pechanec给了您一个很好的解释。
答案 1 :(得分:0)
1)从IntentService
扩展您的服务。
此类服务用于短粒度操作,它在后台线程上运行,因此您可以访问网络。使用方法onHandleIntent(Intent)
而不是onStartCommand(Intent, int, int)
来完成工作。
2)使用AlarmManager
安排此服务(以下代码适用于某项活动)。
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(this, Service.class);
PendingIntent pi = PendingIntent.getService(this, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
long nowElapsed = SystemClock.elapsedRealtime();
long tenMinutes = 10 * 60 * 1000;
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, nowElapsed, tenMinutes, pi);
注意单词"不精确"。这意味着间隔不会精确到600000毫秒。它更节能。
PendingIntent.FLAG_CANCEL_CURRENT
标志用于正确重新安排。
3)当你不再需要它时取消PendingIntent
。在此之后,您的服务将不会自动运行,直到您再次启用它。
Intent i = new Intent(this, Service.class);
PendingIntent pi = PendingIntent.getService(this, 0, i, PendingIntent.FLAG_NO_CREATE);
if (pi != null) pi.cancel;
有关使用闹钟的更多信息:https://developer.android.com/training/scheduling/alarms.html
有关IntentService
的更多信息:http://developer.android.com/reference/android/app/IntentService.html