停止线程,而不是扩展类

时间:2014-11-30 15:49:24

标签: java android multithreading

我一直在寻找这里给出的一些答案,但我没有完全解决我的问题:我不想创建一个新类并扩展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扩展的情况下停止线程?

提前致谢

2 个答案:

答案 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)。我不会重复使用代码IntentServiceAlarmManager,因为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