当前位置:   article > 正文

8.3.2、MVC框架进阶之多个功能组合处理_action-based mvc和 component-based mvc

action-based mvc和 component-based mvc

大纲:0.0、android学习笔记_大纲

源码地址:https://github.com/ldy1993/ToolforAS.git

8.3.1我们已经创建了一个简单的mvc框架。实现了在界面中执行获取sdcard中的某个选中文件名称。

假如我们有新增一个需求,想要把选中的文件上送到后台。

我们可以将选取文件,和上送文件两个功能变成action或者是function或者是server,然后合并到Controller中执行。

我们重新改一下目录结构,将原来单一功能设置成一个一个action,然后由一个大的功能去管理

还是一样的构建一个开始-执行-结束 

  1. /**
  2. * Action 抽象类定义
  3. *
  4. * @author ldy
  5. *
  6. */
  7. public abstract class AAction {
  8. /**
  9. * 子类构造方法必须调用super设置ActionStartListener
  10. * @param listener {@link ActionStartListener}
  11. */
  12. public AAction(ActionStartListener listener) {
  13. this.startListener = listener;
  14. }
  15. /**
  16. * Action结束监听器
  17. * @author ldy
  18. */
  19. private ActionStartListener startListener;
  20. public interface ActionStartListener {
  21. void onStart(AAction Action);
  22. }
  23. /**
  24. * Action结束监听器
  25. * @author ldy
  26. */
  27. private ActionEndListener endListener;
  28. public interface ActionEndListener {
  29. void onEnd(AAction Action, ActionResult result);
  30. }
  31. public void setEndListener(ActionEndListener listener) {
  32. this.endListener = listener;
  33. }
  34. /**
  35. * Action的具体处理方法
  36. */
  37. protected abstract void process();
  38. /**
  39. * 执行Action之前需要先设置{@link ActionEndListener},
  40. * 此接口内部先调用{@link ActionStartListener#onStart(AAction)} ,
  41. * 再调用{@link AAction#process}
  42. */
  43. public void execute() {
  44. if (startListener != null) {
  45. startListener.onStart(this);
  46. }
  47. process();
  48. }
  49. /**
  50. * 设置Action结果, 次接口内部调用{@link ActionEndListener#onEnd(AAction, ActionResult)}方法
  51. * @param result {@link ActionResult}
  52. */
  53. public void setResult(ActionResult result) {
  54. if (endListener != null) {
  55. endListener.onEnd(this, result);
  56. }
  57. }
  58. }

然后分别实例两个action功能

 然后编写Controller,用于按顺序启动各种action

  1. /**
  2. * 事物控制器
  3. * @author ldy
  4. */
  5. public abstract class AController {
  6. private static final String TAG = "AController";
  7. /**
  8. * state和action的绑定关系表
  9. */
  10. private Map<String, AAction> actionMap;
  11. /**
  12. * Action结束监听器
  13. * @author ldy
  14. */
  15. private ControllerEndListener endListener;
  16. public interface ControllerEndListener {
  17. void onEnd(AController controller, ControllerResult result);
  18. }
  19. public void setEndListener(ControllerEndListener listener) {
  20. this.endListener = listener;
  21. }
  22. /**
  23. * 单个state绑定action
  24. * @param state
  25. * @param action
  26. */
  27. protected void bind(final String state, AAction action) {
  28. if (actionMap == null) {
  29. actionMap = new HashMap<String, AAction>();
  30. }
  31. actionMap.put(state, action);
  32. action.setEndListener(new AAction.ActionEndListener() {
  33. @Override
  34. public void onEnd(AAction action, ActionResult result) {
  35. onActionResult(state, result);
  36. }
  37. });
  38. }
  39. /**
  40. * 执行state状态绑定的action
  41. *
  42. * @param state
  43. */
  44. public void gotoState(String state) {
  45. AAction action = actionMap.get(state);
  46. if (action != null) {
  47. action.execute();
  48. } else {
  49. Log.e(TAG, "无效State:" + state);
  50. }
  51. }
  52. /**
  53. * 执行交易
  54. */
  55. public void execute() {
  56. bindStateOnAction();
  57. onStart();
  58. }
  59. /**
  60. * state绑定action抽象方法,在此实现中调用{@link #bind(String, AAction)}方法, 并在最后调用{@link #gotoState(String)}方法,执行第一个state
  61. */
  62. protected abstract void bindStateOnAction();
  63. /**
  64. * 调用前初始化
  65. */
  66. protected abstract void onStart();
  67. /**
  68. * action结果处理
  69. *
  70. * @param currentState :当前State
  71. * @param result :当前Action执行的结果
  72. */
  73. protected abstract void onActionResult(String currentState, ActionResult result);
  74. }

 实力的代码如下

  1. public class UpFileController extends AController {
  2. private static final String TAG = "UpFileController";
  3. enum State {
  4. 选择文件,
  5. 网络通讯;
  6. }
  7. @Override
  8. protected void bindStateOnAction() {
  9. ActionListSdcard actionListSdcard = new ActionListSdcard(new AAction.ActionStartListener() {
  10. @Override
  11. public void onStart(AAction Action) {
  12. }
  13. });
  14. bind(State.选择文件.toString(), actionListSdcard);
  15. ActionCommunication actionCommunication = new ActionCommunication(new AAction.ActionStartListener() {
  16. @Override
  17. public void onStart(AAction Action) {
  18. }
  19. });
  20. bind(State.网络通讯.toString(), actionCommunication);
  21. }
  22. @Override
  23. protected void onStart() {
  24. gotoState(State.选择文件.toString());
  25. }
  26. @Override
  27. protected void onActionResult(String currentState, ActionResult result) {
  28. if (result.getRet() != ActionResult.SUCCESS) {
  29. return;
  30. }
  31. State state = State.valueOf(currentState);
  32. switch (state) {
  33. case 选择文件:
  34. Log.e(TAG,"获取到的文件名称"+result.getDetailMessage());
  35. gotoState(State.网络通讯.toString());
  36. break;
  37. case 网络通讯:
  38. Log.e(TAG,"网络通讯"+result.getDetailMessage());
  39. break;
  40. }
  41. }
  42. }

最后在view中进行调用即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/99971
推荐阅读
相关标签
  

闽ICP备14008679号