zoukankan      html  css  js  c++  java
  • [Android] Android MVP 架构下 最简单的 代码实现

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

    首先看图:

    上图是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

    转载请著名出处!谢谢~~



  • 相关阅读:
    Python 函数 I
    jmeter-将上一个接口的返回值作为下一个接口的参数
    Python 文件的操作
    Python 基础数据类型 VI
    Pyhton 基础数据类型 V (补充)
    Python 基础数据类型 IV (集合)
    Python 基础数据类型 III (字典)
    难道是你?
    是你啦
    checkWeb
  • 原文地址:https://www.cnblogs.com/wukong1688/p/10794023.html
Copyright © 2011-2022 走看看