mvp模式的套路怎么写

先看本文的包结构

一共5个包。global用于保存全局的变量及application,model为javaBean文件保存girlinfo,presenter用于保存与activity对应的presenter

ui包括一个activity和这个activity中需要设置数据而抽象出来的接口。utils是工具类

(本文是仿照网上一篇获取天气demo改写的,那个demo是标准的,model层进行网络请求等逻辑,presenter只是控制逻辑,分的太细,接口太多,在平时的使用中肯定太繁琐了。本文控制逻辑,网络请求等都放在presenter中。)

文章的xml很简单就是一个imageview和一个btn。引了butterKnife和xutls包。

套路在MainActvity的注释中:

code:

MainActivity ------------------------------------------------

package com.yyy.firstmvpdemo.ui;

import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import android.widget.ImageView;

import com.bumptech.glide.Glide;
import com.yyy.firstmvpdemo.R;
import com.yyy.firstmvpdemo.model.GirlInfo;
import com.yyy.firstmvpdemo.presenter.GirlPresenter;

/**
 * 实现mvp模式的思路大概是:把activity(界面)抽象成一个view,这个view中有一些方法用于控制界面的显示。
 * activity实现这个view接口,重写各种设置数据的方法。
 * 并且把实现了这个接口的activity本身传入到presenter中,这样presenter就有了activity的引用
 * presenter中进行逻辑处理,处理完毕,调用传入的引用set各种数据
 *
 *
 * 在这个例子当中,先把mainActivity中需要设置数据的地方抽象成GirlView.(这里需要设置girl的图片和名字,以及控制dialog的显示)
 * 接着mainAcitvity实现这个接口,重写各种设置方法(activity里只是显示各种数据,具体什么时候显示这些数据是presenter中决定的)
 * 再在actvity中实例化一个girlPresenter对象(传入了this.)在用户点击button之后
 * 调用girlPresentergetData方法,这个方法进行网络请求(使用了自己的封装httputils).由于这个girlPresenter
 * 也实现了httputils需要的callback接口,所以在请求成功之后。会回调onSucess函数,在该函数中成功得到一个
 * GirlInfo对象,并且调用开始传入activity对象的setPicView方法(GirlInfo传过来然后执行setText等方法)
 *
 *
 *
 * mvp模式的套路就是
 * 1.activity中需要设置数据的地方抽象出来。比如本例activity一要显示dialog,取消显示dialog,设置imageview和设置btn文字
 * 抽象乘3个方法showLoading hideLoading setPicView
 * 2.activity实现那个抽象接口,重写各种方法。在这各种方法里面分别做真正改变界面的操作
 * 3.把实现了这个抽象接口的activity本身传入到presenter里面,这样presenter里就有了activity的引用
 * 4.然后把逻辑操作写到presenter里。例如本例中点击btn之后调用presentergetLoginData方法,
 * 在请求结束之后,用开始传入的activity实例调用各种设置方法,设置数据setPicViewhideLoading等操作
 * 此外myHttpUtils仍可用,只是让presenter实现callback接口,仍传this.
 */
public class MainActivity extends AppCompatActivity implements GirlView {

    @butterknife.BindView(R.id.iv_mvp)
    ImageView ivMvp;
    @butterknife.BindView(R.id.btn_mvp)
    Button btnMvp;
    GirlPresenter girlPresenter;
    private Dialog loadingDialog;

    public Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        butterknife.ButterKnife.bind(this);
        init();
    }

    private void init() {
        girlPresenter = new GirlPresenter(this);
        loadingDialog = new ProgressDialog(this);
        loadingDialog.setTitle("获取美女中...");
    }

    @butterknife.OnClick(R.id.btn_mvp)
    public void onClick() {
//        girlPresenter.getLoginData();
        girlPresenter.initLoginData(handler);
    }

    @Override
    public void setPicView(GirlInfo girlInfo) {
        Glide.with(this).load(girlInfo.getGirlImageUrl()).into(ivMvp);
        btnMvp.setText(girlInfo.getGirlName());
    }

    @Override
    public void showLoading() {
        loadingDialog.show();
    }

    @Override
    public void hideLoading() {
        loadingDialog.dismiss();
    }
}
GirlView------------------------------------------------
package com.yyy.firstmvpdemo.ui;

import com.yyy.firstmvpdemo.model.GirlInfo;

/**
 * Created by yqr on 2016/10/19 0019.
 */

public interface GirlView {
    void setPicView(GirlInfo girlInfo);
    void showLoading();
    void hideLoading();
}
GirlInfo------------------------------------------------
package com.yyy.firstmvpdemo.model;

/**
 * Created by yqr on 2016/10/19 0019.
 */

public class GirlInfo {
    private String girlImageUrl;
    private String girlName;

    public String getGirlImageUrl() {
        return girlImageUrl;
    }

    public void setGirlImageUrl(String girlImageUrl) {
        this.girlImageUrl = girlImageUrl;
    }

    public String getGirlName() {
        return girlName;
    }

    public void setGirlName(String girlName) {
        this.girlName = girlName;
    }
}

GirlPresenter------------------------------------------------
package com.yyy.firstmvpdemo.presenter;

import android.os.Handler;
import android.util.Log;

import com.yyy.firstmvpdemo.model.GirlInfo;
import com.yyy.firstmvpdemo.ui.GirlView;
import com.yyy.firstmvpdemo.utils.MyHttpUtils;

import java.util.HashMap;

/**
 * Created by yqr on 2016/10/19 0019.
 */

public class GirlPresenter implements MyHttpUtils.MyHttpCallback {
    private GirlView girlView;

    public GirlPresenter(GirlView girlView) {
        this.girlView = girlView;
    }
    public void getLoginData(){
        girlView.showLoading();
        HashMap map = new HashMap<String, String>();
        map.put("user", "84:db:ac:83:49:f2");
        String url = "http://192.168.2.195/training/teacher/teacherLogin";
        new MyHttpUtils().xutilsGet("LOGIN", url, map,this);
    };

    public void initLoginData(Handler handler) {
        girlView.showLoading();
        Log.e("msg110" , "--->" + String.valueOf(Thread.currentThread().getId()));
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                //handlerpost里的run方法是执行在主线程的
                Log.e("msg110" ,"--->" +  String.valueOf(Thread.currentThread().getId()));
                GirlInfo info = new GirlInfo();
                info.setGirlImageUrl("http://c.hiphotos.baidu.com/image/h%3D300/sign=93a3266b273fb80e13d167d706d02ffb/4034970a304e251f0780cea2a186c9177f3e5370.jpg");
                info.setGirlName("刘诗诗");
                girlView.setPicView(info);
                girlView.hideLoading();
            }
        } , 2000);
    }

    @Override
    public void onSuccess(String result, String whereRequest) {
        switch (whereRequest) {
            case "LOGIN":
                girlView.hideLoading();
                GirlInfo info = new GirlInfo();
                info.setGirlImageUrl("http://c.hiphotos.baidu.com/image/h%3D300/sign=93a3266b273fb80e13d167d706d02ffb/4034970a304e251f0780cea2a186c9177f3e5370.jpg");
                info.setGirlName("刘诗诗");
                girlView.setPicView(info);
                break;
            default:
                break;
        }

    }

    @Override
    public void onError(String errorMsg, String whereRequest) {
        girlView.hideLoading();
    }
}

MyHttpUtils------------------------------------------------

package com.yyy.firstmvpdemo.utils;

import android.util.Log;

import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import org.xutils.x;

import java.util.HashMap;

/**
 * Created by yqr on 2016/10/18 0018.
 */

public class MyHttpUtils {
    String results = "";

    /**
     * @param whereRequest 请求名字
     * @param url          请求地址
     * @param map          请求参数map
     * @param callback     回调方法
     * @return
     */
    public void xutilsGet(final String whereRequest, String url, HashMap<String, String> map, final MyHttpCallback callback) {
        RequestParams params = new RequestParams(url);
        for (String key : map.keySet()) {
            String value = map.get(key);
            params.addBodyParameter(key, value);
        }
        params.addBodyParameter("token", "token");
        x.http().get(params, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String result) {
                Log.e("", "");
                callback.onSuccess(result, whereRequest);
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                Log.e("", "");
                callback.onError("出错了" + "onError", whereRequest);
            }

            @Override
            public void onCancelled(CancelledException cex) {
                Log.e("", "");
                callback.onError("出错了" + "onCancelled", whereRequest);
            }

            @Override
            public void onFinished() {
                Log.e("", "");
            }
        });
    }

    /**
     * @param whereRequest 请求名字
     * @param url          请求地址
     * @param map          请求参数map
     * @param callback     回调方法
     */
    public void xutilsPost(final String whereRequest, String url, HashMap<String, String> map, final MyHttpCallback callback) {
        RequestParams params = new RequestParams(url);
        for (String key : map.keySet()) {
            String value = map.get(key);
            params.addBodyParameter(key, value);
        }
        params.addBodyParameter("token", "token");
        x.http().post(params, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String result) {
                Log.e("", "");
                callback.onSuccess(result, whereRequest);
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                Log.e("", "");
                callback.onError("出错了" + "onError", whereRequest);
            }

            @Override
            public void onCancelled(CancelledException cex) {
                Log.e("", "");
                callback.onError("出错了" + "onCancelled", whereRequest);
            }

            @Override
            public void onFinished() {
                Log.e("", "");
            }
        });
    }


    public interface MyHttpCallback {
        void onSuccess(String result, String whereRequest);

        void onError(String errorMsg, String whereRequest);
    }

}

MyApplication------------------------------------------------
package com.yyy.firstmvpdemo.global;

import android.app.Application;

import org.xutils.x;

/**
 * Created by yqr on 2016/10/19 0019.
 */

public class MyApplication extends Application{
    private static MyApplication mInstance;
    public static MyApplication mApplicationContext = null;
    @Override
    public void onCreate() {
        super.onCreate();
        x.Ext.init(this);
        x.Ext.setDebug(true); // 是否输出debug日志

        mInstance = this;
        mApplicationContext = this;
    }
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值