[Android] 简单的状态机实现

package com.lehome.statemachine;

import java.util.HashMap;

public abstract class State {

    HashMap<Integer, State> 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<State> mStates = new HashSet<State>();
    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<Integer, State> 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/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值