先看本文的包结构
一共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之后 * 调用girlPresenter的getData方法,这个方法进行网络请求(使用了自己的封装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之后调用presenter的getLoginData方法, * 在请求结束之后,用开始传入的activity实例调用各种设置方法,设置数据setPicView,hideLoading等操作 * 此外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() { //handler的post里的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; } }