Android的MVI架构(Java版本)

简述(这部分看不懂可以直接看使用 然后再回来看就很简单了)

MVI(Model-View-Intent)是一种在Android应用程序中使用的架构模式,它帮助管理应用程序的状态和处理用户交互。

MVI架构的核心思想是单向数据流,它将应用程序的逻辑划分为三个主要组件:

  1. Model(模型):模型代表应用程序的状态和数据。它可以是一个简单的数据类或者是一个包含更复杂业务逻辑的类。模型的状态是不可变的,每当状态发生变化时,都会创建一个新的模型对象。

  2. View(视图):视图是用户界面,负责显示数据并处理用户的输入。它接收来自用户的动作,并将它们转化为意图(Intents)发送给ViewModel。

  3. Intent(意图):意图是用户的动作或意图,描述了用户希望应用程序执行的操作。它可以是按钮点击、文本输入、滑动等用户交互行为。

除了上述三个主要组件之外,MVI架构还包括以下组件:

  1. ViewModel(视图模型):视图模型是MVI架构的核心组件。它接收来自视图的意图,并根据意图处理数据和状态更新。视图模型还可以执行一些业务逻辑和数据转换,最后将新的状态发送回视图进行显示。

  2. Reducer(减速器):减速器是视图模型的一部分,它接收意图和当前模型状态,并计算新的模型状态。减速器是一个纯函数,它根据当前状态和接收到的意图来计算下一个状态。

  3. Action(动作):动作是视图模型发出的指令,它描述了某个操作需要在视图上执行的动作。例如,显示加载中的状态、显示错误消息、导航到其他屏幕等。

  4. Side Effects(副作用):副作用是指在处理意图时可能发生的异步操作,例如网络请求、数据库访问、文件读写等。副作用被封装在特定的类中,并由视图模型进行管理。

MVI架构的工作流程如下:

  1. 用户与视图进行交互,例如点击按钮。

  2. 视图将用户的动作转化为意图,并发送给视图模型。

  3. 视图模型接收意图,并根据意图处理数据和状态更新。

  4. 视图模型根据意图计算新的模型状态,并发出相应的动作。

  5. 视图接收新的状态和动作,并更新用户界面以反映新的状态。

MVI架构的优点包括明确的数据流、可预测的状态管理、可测试性和可扩展性。它帮助开发者更好地组织代码、分离关注点,并减少了状态管理的复杂性。

使用

举个栗子,在这个例子中,模型(Model)表示计数器的状态和数据,意图(Intent)表示用户的操作,减速器(Reducer)根据意图和当前模型状态计算新的模型状态,副作用(Side Effect)处理发送数字到服务器的操作。视图模型(ViewModel)接收意图,更新模型状态,并触发相应的动作和副作用。视图(View)负责显示数据并处理用户输入,并通过Toast显示发送到服务器的数字。

首先,定义模型(Model)类,表示应用程序的状态和数据:

public class CounterModel {
    private int count;

    public CounterModel(int count) {
        this.count = count;
    }

    public int getCount() {
        return count;
    }
}

接下来,定义意图(Intent)类,表示用户的操作:

public interface CounterIntent {
    // 用户点击加一按钮的意图
    class Increment implements CounterIntent {
    }

    // 用户点击减一按钮的意图
    class Decrement implements CounterIntent {
    }
}

然后,定义减速器(Reducer)类,负责根据意图和当前模型状态计算新的模型状态:

public class CounterReducer {
    //处理按view意图逻辑然后更新状态
    public static CounterModel reduce(CounterModel model, CounterIntent intent) {
        if (intent instanceof CounterIntent.Increment) {
            return new CounterModel(model.getCount() + 1);
        } else if (intent instanceof CounterIntent.Decrement) {
            return new CounterModel(model.getCount() - 1);
        }
        return model;
    }
}

接下来,定义副作用(Side Effect)类,用于处理发送数字到服务器的操作:

public class CounterSideEffect {
    public void sendNumberToServer(int number) {
        // 发送数字到服务器的逻辑
        // 这里只是一个示例,实际操作需要根据你的服务器通信方式进行实现
        Toast.makeText(getApplicationContext(), "发送数字到服务器:" + number, Toast.LENGTH_SHORT).show();
    }
}

然后,定义视图模型(ViewModel)类,处理意图并更新模型的状态,并触发相应的动作和副作用:

public class CounterViewModel {
    private CounterModel model;
    private CounterSideEffect sideEffect;

    public CounterViewModel() {
        model = new CounterModel(0);
        sideEffect = new CounterSideEffect();
    }

    public CounterModel getModel() {
        return model;
    }

    public void processIntent(CounterIntent intent) {
        model = CounterReducer.reduce(model, intent);

        if (intent instanceof CounterIntent.Increment) {
            sideEffect.sendNumberToServer(model.getCount());
        } else if (intent instanceof CounterIntent.Decrement) {
            sideEffect.sendNumberToServer(model.getCount());
        }
    }
}

最后,定义视图(View)类,负责显示数据并处理用户输入,并通过Toast显示发送到服务器的数字:

public class CounterActivity extends AppCompatActivity {
    private CounterViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_counter);

        viewModel = new CounterViewModel();

        Button incrementButton = findViewById(R.id.increment_button);
        Button decrementButton = findViewById(R.id.decrement_button);

        incrementButton.setOnClickListener(v -> {
            viewModel.processIntent(new CounterIntent.Increment());
            showToast(String.valueOf(viewModel.getModel().getCount()));
        });

        decrementButton.setOnClickListener(v -> {
            viewModel.processIntent(new CounterIntent.Decrement());
            showToast(String.valueOf(viewModel.getModel().getCount()));
        });
    }

    private void showToast(String message) {
        Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码划云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值