分享

[Android] Android MVP 架构下 最简单的 代码实现

 印度阿三17 2019-04-30

首先看图:

上图是MVP,下图是MVC

MVP和MVC的区别,在于以前的View层不仅要和model层交互,还要和controller层交互。而在mvp中,view层只和presenter层交互,而model层也和presenter交互,presenter构成了view层和model层的桥梁,也解耦了view层和model层。这一点很关键。我认为,这也是mvp的本质:

解耦view层和model层,让view层和model层通过presenter层进行通信。换个说法就是让诸如网络请求,数据库读写的逻辑,从activity中剥离出来。activit只负责页面的展示,不关心model层的逻辑。

简单的MVP模式,3个class 和 1个interface 就可以实现

各文件主要功能如下:

1个interface:定义activity 要实现的回调方法

3个class:1个Model层定义文件   1个业务逻辑 Presenter文件  1个Activity文件

列举实现代码

1)interface定义文件

MainCallBack.java

package com.jack.basemvp.basemvp;

/**
 * 定义要实现的回调方法
 */
public interface MainCallBack {
    void getMessage(String message);
    void error();
}

2)Model层文件

MainModel.java

package com.jack.basemvp.basemvp;

import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;

/**
 * 定Model
 */
public class MainModel {
    public Call getData(String url) {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(url).build();
        return client.newCall(request);
    }
}

3)Presenter层文件

MainPresenter.java

package com.jack.basemvp.basemvp;

import android.support.annotation.NonNull;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

/**
 * 定义业务逻辑 Presenter
 */
public class MainPresenter {
    private MainCallBack callBack;
    private MainModel model;

    public MainPresenter(MainCallBack callBack) {
        this.callBack = callBack;
        model=new MainModel();
    }

    public void getUrlData(String url){
        model.getData(url).enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                callBack.error();
            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                callBack.getMessage(response.body().string());
            }
        });
    }

}

4)activity调用

SimpleMvpActivity.java

package com.jack.basemvp.activity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.jack.basemvp.R;
import com.jack.basemvp.basemvp.MainCallBack;
import com.jack.basemvp.basemvp.MainPresenter;

import java.lang.ref.WeakReference;

public class SimpleMvpActivity extends AppCompatActivity implements View.OnClickListener,MainCallBack{
    public EditText simple_et;
    Button btn_submit_req;
    TextView simple_tv;

    private MainPresenter presenter;
    private MyHandler handler;

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

        simple_et = (EditText) findViewById(R.id.simple_et);
        btn_submit_req = (Button) findViewById(R.id.btn_submit_req);
        simple_tv = (TextView) findViewById(R.id.simple_tv);

        handler = new MyHandler(this);
        presenter = new MainPresenter(this);

        btn_submit_req.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_submit_req:
                String url = simple_et.getText().toString();
                presenter.getUrlData(url);
                break;
        }
    }

    @Override
    public void getMessage(String message) {
        Message msg = handler.obtainMessage(0, message);
        handler.sendMessage(msg);
    }

    @Override
    public void error() {
        Message msg = handler.obtainMessage(1, "error");
        handler.sendMessage(msg);
    }

    private static class MyHandler extends Handler {
        private WeakReference<SimpleMvpActivity> reference;

        private MyHandler(SimpleMvpActivity activity) {
            reference = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            SimpleMvpActivity activity = reference.get();
            switch (msg.what) {
                case 0:
                    activity.simple_tv.setText(msg.obj.toString());
                    break;
                case 1:
                    activity.simple_tv.setText(msg.obj.toString());
                    break;
            }
        }
    }
}

具体代码见Github:

https://github.com/wukong1688

本博客地址: wukong1688

本文原文地址:https://www.cnblogs.com/wukong1688/p/10794023.html




来源:http://www./content-4-177151.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多