1、bean文件夹属于封装的对象
2、model---我把他的定义就是专门写网路请求的
3、presenter----我把他当做是沟通的桥梁,实现数据层与视图层的交互
4、view---最简单的视图层包括(activity、adapter、fragment等。。。)
解释一下我不喜欢讲话,所以一般都是代码或者截图了。
1、我那登录作为例子
2、我网路框架用的是volley,为什么用volley呢?答案:因为这个我最熟的网络框架就是这个哈哈哈
3、我喜欢说话总是讲究1,2,3.。因为我觉得清晰明了
下面正题
先说一下model
上代码
public class LoginModel { /** * 登录请求 * * @param pwd * @param listener * @param errorListener */ public void mbMem_login(final String phone, final String pwd, Response.Listenerlistener, Response.ErrorListener errorListener, final Context context) { MyStringRequest jsonObjectRequest = new MyStringRequest(Request.Method.POST, HttpUrl.mbMem_login, listener, errorListener) { @Override protected Map getParams() throws AuthFailureError { // 请求参数 Map map = new HashMap (); map.put("memaccount", phone); map.put("mempass", MD5Util.toMD5(pwd)); map.put("client", "Android"); map.put("logintype", "mobphone"); return map; } @Override protected Response parseNetworkResponse( NetworkResponse response) { Response superResponse = super .parseNetworkResponse(response); Map responseHeaders = response.headers; String rawCookies = responseHeaders.get("Set-Cookie"); //Constant是一个自建的类,存储常用的全局变量 UserBean userBean = new UserBean(); userBean.setMemid(""); userBean.setEmail(""); userBean.setBirthday(""); userBean.setGender(""); userBean.setLogofilepathname(""); userBean.setMobphone(""); userBean.setNickname(""); userBean.setCookieId(rawCookies.substring(0, rawCookies.indexOf(";"))); UserInfoUtil.getInstance().setUser(userBean, context); return superResponse; } }; jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(50000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); jsonObjectRequest.setTag("mbMem_login"); MutualApplication.getRequestQueue().add(jsonObjectRequest); } }
纯纯的就是代码截图,不好意思
解释:这个最简单就是简单的网路请求,返回数据在presenter层接收
看见没在presenter层实例化的这里传过来,不好意思说的有点多
说一下view层
@Override protected void initView() { ButterKnife.inject(this); loginPresenter = new LoginPresenter(); if (loginPresenter != null) loginPresenter.attachView(this); } @Override protected void onDestroy() { super.onDestroy(); if (loginPresenter != null) { loginPresenter.detachView(); } }
解释实例化在activity或者fragment中
实例化presenter
既然说到实例化presenter
上presenter代码吧
public class LoginPresenter extends BasePresenter{ @Override public LoginModel loadModel() { return new LoginModel(); } /** * 登录 * * @param context * @param phone * @param pwd */ public void mbMem_login(final Context context, final String phone, final String pwd) { getiModel().mbMem_login(phone, pwd, new Response.Listener () { @Override public void onResponse(String s) { try { final JSONObject jsonObject = new JSONObject(s.toString()); if (Status.status(jsonObject)) { //登录成功 getIView().loginSuccess(jsonObject.getJSONObject("bMem"), jsonObject); } else { //请求失败 Status.fail(context, jsonObject); UserInfoUtil.getInstance().setUser(null, context); } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { //网路失败 HintUtil.network_error(context); } }, context); } }
解释:
view调用Presenter 的登录方法Presenter 总的login方法去调用model的网络请求请求结果返回到Presenter 层通过返回数据控制view层的UI变化。那presenter层还需要继承一个抽象类来实现必须实现的方法。
上代码
public abstract class BasePresenter<M, V> { private WeakReference actReference; protected M iModel; public M getiModel() { iModel = loadModel(); //使用前先进行初始化 return iModel; } public void attachView(Object view) { actReference = new WeakReference(view); } public void detachView() { if (actReference != null) { actReference.clear(); actReference = null; } } public V getIView() { return (V) actReference.get(); } public abstract M loadModel(); }
使用了弱引用来获取view的属性方法