您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        一般状态的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;
                    // 继续
                }
            }
        }
    }
}
													免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。