91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

狀態機的一般實現

發布時間:2020-05-31 04:38:34 來源:網絡 閱讀:12017 作者:longsam 欄目:編程語言

相關概念

  • 有限狀態機/finite-state machine (FSM): 具有有限狀態數目的狀態機,是最常用的狀態機,也是一般討論狀態機時所指的對象
  • 無限狀態機/Infinite State Machine:具有無限狀態數目的狀態機,很少用到
  • 狀態/state:狀態可達到的某個狀態
  • 狀態轉換/transition:狀態機的從一個狀態轉變為另一個狀態
  • 輸入/input/事件/event:可被被狀態機接收并處理的事件輸入,可能導致狀態變動

一般狀態的UML表示如下:

狀態機的一般實現

狀態機的一般實現

狀態機的一般實現

狀態機的一般實現

一個播放器示例

public enum State {

    IDLE,

    DATA_SOURCE,

    PREPARING,

    PREPARED,

    STARTING,

    STARTED,

    BUFFERING,

    READY,

    SWITCHING_PROGRAM,

    SWITCHING_CHANNEL,

    SWITCHING_DEFINITION,

    SWITCHING_ENGINE,

    STOPPING,

    RELEASING,

    ERROR
}

狀態的順序很重要,盡量按照stack的形式,對于特殊狀態特殊處理,比如error。

public class Event {

    public static class SetDataSourceEvent extends LoopEvent {
        public Uri uri;

        public SetDataSourceEvent() {}

        public SetDataSourceEvent(Uri uri) {
            this.uri = uri;
        }
    }

    public static class PrepareEvent extends LoopEvent {}

    public static class StartEvent extends LoopEvent {}

    public static class SwitchChannelEvent extends LoopEvent {
        public int cateIndex;
        public int channelIndex;

        public SwitchChannelEvent() {}

        public SwitchChannelEvent(int cateIndex, int channelIndex) {
            this.cateIndex = cateIndex;
            this.channelIndex = channelIndex;
        }
    }

    public static class SwitchDefinitionEvent extends LoopEvent {
        public int definition;

        public SwitchDefinitionEvent() {}

        public SwitchDefinitionEvent(int definition) {
            this.definition = definition;
        }
    }

    public static class SwitchEngineEvent extends LoopEvent {
        public String engine;

        public SwitchEngineEvent() {}

        public SwitchEngineEvent(String engine) {
            this.engine = engine;
        }
    }

    public static class StopEvent extends LoopEvent {}
}
public abstract class Action {
    protected abstract void doAction() throws Exception;
}

public class Action1 extends Action {
    protected void doAction() throws Exception {
        // xxxx
        // update state
    }
}

...
public abstract class LoopStateMachine {

    private ActionThread mActionThread = new ActionThread("LoopActionThread");

    private BlockingQueue<Action> mActionQueue = new ArrayBlockingQueue<>(100);

    private State mState;

    public void sendEvent(Event event) {
        // 根據event創建action并塞入mActionQueue
    }

    private class ActionThread extends Thread {
        public ActionThread(String name) {
            super(name);
        }

        @Override
        public void run() {
            super.run();
            while (true) {
                try {
                    LoopAction action = mActionQueue.take();
                    action.doAction();
                } catch (Exception e) {
                    Logger.w(TAG, "$ActionThread#run(): exception", e);

                    mState = State.ERROR;
                    // 繼續
                }
            }
        }
    }
}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

翁牛特旗| 咸宁市| 通榆县| 台北县| 图片| 梧州市| 扬州市| 页游| 婺源县| 景谷| 德清县| 新闻| 河北省| 通州市| 天峨县| 灵寿县| 上犹县| 连州市| 南溪县| 乌鲁木齐县| 永康市| 荆门市| 建瓯市| 汝城县| 平阴县| 颍上县| 应用必备| 庆阳市| 特克斯县| 永昌县| 县级市| 犍为县| 公主岭市| 叶城县| 高密市| 康保县| 汕尾市| 时尚| 苍山县| 永寿县| 正镶白旗|