有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在IntentService中管理倒计时?

我正在使用IntentService实现一个Pomotoro计时器,我似乎在努力管理IntentService中的计时器。我目前的情况如下:

代码:

package com.nursson.pomodorotimer.service;

import 安卓.app.IntentService;
import 安卓.content.Intent;
import 安卓.os.CountDownTimer;
import 安卓.os.Looper;
import 安卓.support.v4.content.LocalBroadcastManager;
import 安卓.util.Log;

import com.nursson.pomodorotimer.model.Pomodoro;

/**
 * An {@link IntentService} subclass for handling asynchronous task requests in
 * a service on a separate handler thread.
 * <p/>
 * helper methods.
 */
public class PomodoroService extends IntentService {

    public static final String ACTION_CANCELLED = "com.nursson.pomodorotimer.service.pomodoro.action.CANCELLED";
    public static final String ACTION_COMPLETE = "com.nursson.pomodorotimer.service.pomodoro.action.COMPLETE";
    public static final String ACTION_START = "com.nursson.pomodorotimer.service.pomodoro.action.START";
    public static final String ACTION_STOP = "com.nursson.pomodorotimer.service.pomodoro.action.STOP";
    public static final String ACTION_TICK = "com.nursson.pomodorotimer.service.pomodoro.action.TICK";

    public static final String EXTRA_TIME_REMAINING = "com.nursson.pomodorotimer.service.pomodoro.param.TIME_REMAINING";

    private boolean started;
    private CountDownTimer countDownTimer = new CountDownTimer(10000, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            Intent tickIntent = new Intent(ACTION_TICK);
            tickIntent.putExtra(EXTRA_TIME_REMAINING, millisUntilFinished);
            LocalBroadcastManager.getInstance(PomodoroService.this).sendBroadcast(tickIntent);
            Log.i("TIMER", "ticking...");
        }

        @Override
        public void onFinish() {
            started = false;
            Intent tickIntent = new Intent(ACTION_COMPLETE);
            LocalBroadcastManager.getInstance(PomodoroService.this).sendBroadcast(tickIntent);
            Log.i("TIMER", "countdown Finished()");
            Looper.myLooper().quit();
        }
    };

    public PomodoroService() {
        super("PomodoroService");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("TIMER", "onCreate()");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        countDownTimer.cancel();
        Log.i("TIMER", "onDestroy()");
    }

    @Override
    public void onHandleIntent(Intent intent) {

        if (intent == null) {
            return;
        }

        switch (intent.getAction()) {
            case ACTION_START:
                handleStartAction();
                break;
            case ACTION_STOP:
                handleStopAction();
                break;
        }

        Looper.loop();
    }

    private void handleStopAction() {
        Log.i("TIMER", "handleStopAction(): " + started);
        if (started) {
            Log.i("TIMER", "handleStopAction() - Cancel Timer");
            started = false;
            countDownTimer.cancel();
            Intent tickIntent = new Intent(ACTION_CANCELLED);
            LocalBroadcastManager.getInstance(PomodoroService.this).sendBroadcast(tickIntent);
        }
    }

    private void handleStartAction() {
        Log.i("TIMER", "handleStartAction()"  + started);
        if (!started) {
            Log.i("TIMER", "handleStartAction() - Starting Timer");
            started = true;
            countDownTimer.start();
        }
    }

    boolean isStarted() {
        return started;
    }

    CountDownTimer getCountDownTimer() {
        return countDownTimer;
    }
}

代码中发生了什么

这基本上是一个IntentService,它包含一个倒计时程序,用于向活动广播消息。它还使用Looper.loop();Looper.myLooper().quit();来尝试和管理生命周期。如果我不包括这个,那么onDestroy()会被调用,倒计时会一直运行到最后。我想在计时器结束后调用onDestroy()

我得到的例外是当代码到达Looper.myLooper().quit();时,这是下面的堆栈跟踪:

08-29 02:27:38.855 3337-3337/com.nursson.pomodorotimer E/AndroidRuntime: FATAL EXCEPTION: main
                                                                         Process: com.nursson.pomodorotimer, PID: 3337
                                                                         java.lang.IllegalStateException: Main thread not allowed to quit.
                                                                             at 安卓.os.MessageQueue.quit(MessageQueue.java:415)
                                                                             at 安卓.os.Looper.quit(Looper.java:228)
                                                                             at com.nursson.pomodorotimer.service.PomodoroService$1$override.onFinish(PomodoroService.java:44)
                                                                             at com.nursson.pomodorotimer.service.PomodoroService$1$override.access$dispatch(PomodoroService.java)
                                                                             at com.nursson.pomodorotimer.service.PomodoroService$1.onFinish(PomodoroService.java:0)
                                                                             at 安卓.os.CountDownTimer$1.handleMessage(CountDownTimer.java:127)
                                                                             at 安卓.os.Handler.dispatchMessage(Handler.java:102)
                                                                             at 安卓.os.Looper.loop(Looper.java:148)
                                                                             at 安卓.app.ActivityThread.main(ActivityThread.java:5417)
                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                             at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                             at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我想发生什么

我希望能够使用IntentService启动和停止倒计时,并在这样做时成为一个“好公民”

最终目标是有一个计时器,可以持续到方向改变,并可以在活动结束时继续运行

到目前为止我所尝试的:

  • 正在删除Looper.myLooper().quit();。然后onDestroy()在倒计时结束时永远不会被调用
  • 删除任何Looper引用。然后onDestroy()被调用得太早了。计时器工作,但我无法获得倒计时的引用来取消它

我的想法:

  • 有一个倒计时的替代品更适合我想做的事吗?也许是经理
  • 我应该使用服务而不是IntentService,这样可以更容易地处理倒计时

共 (0) 个答案