package com.lehome.statemachine;import java.util.HashMap;public abstract class State {    HashMap mToStates = new HashMap<>();    @SuppressWarnings("unused")    private String mName = "UNKNOWN";    public State(String name) {        mName = name;    }    public void moveTo(State toState, int event) {        if (toState == null) {            throw new IllegalArgumentException("toState cannot be null");        }        mToStates.put(event, toState);    }    public void onStart() {};    public void onStop(int cause) {};    public void onReset(int cause) {};    public void onUnhandleEvent(int event) {};    public abstract void onEnter(State fromState, int event);    public abstract void onLeave(State toState, int event);}package com.lehome.statemachine;import java.util.HashMap;import java.util.HashSet;import java.util.Set;import android.os.Handler;public class StateMachine {    Set mStates = new HashSet();    private State mInitState;    private State mCurrentState;    Handler mHandler;    public StateMachine() {        mHandler = new Handler();    }    public StateMachine(Handler handler) {        mHandler = handler;    }    public void setInitState(State initState) {        mInitState = initState;    }    public void addState(State state) {        synchronized (this) {            mStates.add(state);        }    }    public void start() {        synchronized (this) {            for (State state : mStates) {                state.onStart();            }            mCurrentState = mInitState;        }    }    public void stop(int cause) {        synchronized (this) {            for (State state : mStates) {                state.onStop(cause);            }        }    }    public void reset(int cause) {        synchronized (this) {            for (State state : mStates) {                state.onReset(cause);            }        }    }    public void postEvent(int event) {        if (mHandler == null) {            return;        }        final int ev = event;        mHandler.post(new Runnable() {            @Override            public void run() {                State nextState = mCurrentState.mToStates.get(ev);                if (nextState == null) {                    mCurrentState.onUnhandleEvent(ev);                    return;                }                mCurrentState.onLeave(nextState, ev);                nextState.onEnter(mCurrentState, ev);                mCurrentState = nextState;            }        });    }    public boolean canMoveTo(State toState) {        if (toState == null) {            return false;        }        synchronized (this) {            HashMap states = mCurrentState.mToStates;            for (Integer event : states.keySet()) {                if (states.get(event).equals(toState)) {                    return true;                }            }            return false;        }    }    public boolean canAccept(int event) {        synchronized (this) {            return mCurrentState.mToStates.containsKey(event);        }    }    public State getCurrentState() {        return mCurrentState;    }}

查看原文:http://legendmohe.net/2015/12/01/android-%e7%ae%80%e5%8d%95%e7%9a%84%e7%8a%b6%e6%80%81%e6%9c%ba%e5%ae%9e%e7%8e%b0/

更多相关文章

  1. Android(安卓)Lesson Two: Ambient and Diffuse Lighting
  2. Android(安卓)startActivity rotate 3d animation: ActivitySwit
  3. android开发 - NDK_PROJECT_PATH = null问题分析
  4. adb top 指令,查看系统进程
  5. AndroidX和android.support对照表
  6. Androidアプリを他機へ可搬化するVM, Alien Dalvik 2.0がロンチ
  7. Android(安卓)- 简单的查看APP启动时间
  8. Android-Task Affinity
  9. 如何解决安卓SDK无法下载Package的问题

随机推荐

  1. Android获取不到ID
  2. Android 中Bitmap 进行绘制编辑
  3. Android 自定义分享列表ACTION_SEND
  4. 从Android(安卓)Launcher源码学习自定义
  5. centos 7 安装android 模拟器genymotion
  6. 2017 Android(安卓)github上优秀开源项目
  7. Android ExpandableListView显示模板
  8. Android与Js交互获取返回值
  9. Android CTS
  10. openssl移植android