MVP——联网登录

MVP——联网登录

1、依赖

 implementation 'com.google.code.gson:gson:2.8.+'

 implementation 'com.squareup.okhttp3:okhttp:3.9.1'

2、权限

 <uses-permission android:name="android.permission.INTERNET"/>

3、activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.bwie.mvpdemo.view.MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入手机号"
        android:text="13654897654"
        android:id="@+id/etMobile"/>

    <EditText
        android:id="@+id/etPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="123456"
        android:hint="请输入密码"/>

    <Button
        android:onClick="btnLogin"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="登陆"/>

    <TextView
        android:id="@+id/tvContent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

4、Constants类

package com.bwie.mvpdemo;
/**
 * 常量类
 */
public class Constants {
    //请求的服务器主机名
    public static final String HOST_NAME = "http://120.27.23.105";
    /**
     * 登录请求接口
     */
    public static final String LOGIN = HOST_NAME+"/user/login";
}

5、bean包下的LoginInfo

package com.bwie.mvpdemo.bean;
/**
 * Created by rookie on 2018/1/5.
 */
public class LoginInfo {
    /**
     * msg : 登录成功
     * code : 0
     * data : {"age":null,"appkey":"ccfc3899b5f9ae28","appsecret":"7DA7A7FE56F4198CE68E3F2601543577","createtime":"2018-01-05T15:37:33","email":null,"fans":null,"follow":null,"gender":null,"icon":"https://www.zhaoapi.cn/images/1514990580954img.png","latitude":null,"longitude":null,"mobile":"13654897654","money":null,"nickname":null,"password":"8F669074CAF5513351A2DE5CC22AC04C","praiseNum":null,"token":"49C7ED8F83E08749F83FE8EF8404AC67","uid":10671,"userId":null,"username":"13654897654"}
     */
    private String msg;
    private String code;
    private DataBean data;
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public DataBean getData() {
        return data;
    }
    public void setData(DataBean data) {
        this.data = data;
    }
    public static class DataBean {
        /**
         * age : null
         * appkey : ccfc3899b5f9ae28
         * appsecret : 7DA7A7FE56F4198CE68E3F2601543577
         * createtime : 2018-01-05T15:37:33
         * email : null
         * fans : null
         * follow : null
         * gender : null
         * icon : https://www.zhaoapi.cn/images/1514990580954img.png
         * latitude : null
         * longitude : null
         * mobile : 13654897654
         * money : null
         * nickname : null
         * password : 8F669074CAF5513351A2DE5CC22AC04C
         * praiseNum : null
         * token : 49C7ED8F83E08749F83FE8EF8404AC67
         * uid : 10671
         * userId : null
         * username : 13654897654
         */


        private Object age;
        private String appkey;
        private String appsecret;
        private String createtime;
        private Object email;
        private Object fans;
        private Object follow;
        private Object gender;
        private String icon;
        private Object latitude;
        private Object longitude;
        private String mobile;
        private Object money;
        private Object nickname;
        private String password;
        private Object praiseNum;
        private String token;
        private int uid;
        private Object userId;
        private String username;
        public Object getAge() {
            return age;
        }
        public void setAge(Object age) {
            this.age = age;
        }
        public String getAppkey() {
            return appkey;
        }
        public void setAppkey(String appkey) {
            this.appkey = appkey;
        }
        public String getAppsecret() {
            return appsecret;
        }
        public void setAppsecret(String appsecret) {
            this.appsecret = appsecret;
        }
        public String getCreatetime() {
            return createtime;
        }
        public void setCreatetime(String createtime) {
            this.createtime = createtime;
        }
        public Object getEmail() {
            return email;
        }
        public void setEmail(Object email) {
            this.email = email;
        }
        public Object getFans() {
            return fans;
        }
        public void setFans(Object fans) {
            this.fans = fans;
        }
        public Object getFollow() {
            return follow;
        }
        public void setFollow(Object follow) {
            this.follow = follow;
        }
        public Object getGender() {
            return gender;
        }
        public void setGender(Object gender) {
            this.gender = gender;
        }
        public String getIcon() {
            return icon;
        }
        public void setIcon(String icon) {
            this.icon = icon;
        }
        public Object getLatitude() {
            return latitude;
        }
        public void setLatitude(Object latitude) {
            this.latitude = latitude;
        }
        public Object getLongitude() {
            return longitude;
        }
        public void setLongitude(Object longitude) {
            this.longitude = longitude;
        }
        public String getMobile() {
            return mobile;
        }
        public void setMobile(String mobile) {
            this.mobile = mobile;
        }
        public Object getMoney() {
            return money;
        }
        public void setMoney(Object money) {
            this.money = money;
        }


        public Object getNickname() {
            return nickname;
        }


        public void setNickname(Object nickname) {
            this.nickname = nickname;
        }


        public String getPassword() {
            return password;
        }


        public void setPassword(String password) {
            this.password = password;
        }


        public Object getPraiseNum() {
            return praiseNum;
        }


        public void setPraiseNum(Object praiseNum) {
            this.praiseNum = praiseNum;
        }


        public String getToken() {
            return token;
        }


        public void setToken(String token) {
            this.token = token;
        }


        public int getUid() {
            return uid;
        }


        public void setUid(int uid) {
            this.uid = uid;
        }


        public Object getUserId() {
            return userId;
        }


        public void setUserId(Object userId) {
            this.userId = userId;
        }


        public String getUsername() {
            return username;
        }


        public void setUsername(String username) {
            this.username = username;
        }
    }
}

6、model包下的ILoginModel

package com.bwie.mvpdemo.model;
import com.bwie.mvpdemo.presenter.ILoginPresenter;

public interface ILoginModel {
    void login(String mobile, String password, ILoginPresenter iLoginPresenter);
}

7、model下的LoginModel

package com.bwie.mvpdemo.model;
import android.os.Handler;
import com.bwie.mvpdemo.Constants;
import com.bwie.mvpdemo.presenter.ILoginPresenter;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/**
 * MVP当中的Model层 : 业务逻辑,网络请求
 */
public class LoginModel implements ILoginModel{
    private static Handler handler = new Handler();
    public void login(String mobile, String password, final ILoginPresenter iLoginPresenter){
        String url = Constants.LOGIN+"?mobile="+mobile+"&password="+password;
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder()
                .get()
                .url(url)
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {//子线程
            @Override
            public void onFailure(Call call, final IOException e) {
               handler.post(new Runnable() {
                    @Override
                    public void run() {
                        iLoginPresenter.onFailed(e.getMessage());
                    }
                });
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
               if(response.isSuccessful()){
                    final String result = response.body().string();//JSON
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            iLoginPresenter.onSccuess(result);
                        }
                    });
                }
            }
        });

    }
}

8、presenter包下的ILoginPresenter

package com.bwie.mvpdemo.presenter;
/**
 * Created by rookie on 2018/1/5.
 */
public interface ILoginPresenter {
    void login(String mobile,String password);
    void onFailed(String msg);
    void onSccuess(Object o);
    //销毁的方法
    void onDestory();
}

9、presenter包下的LoginPresenter

package com.bwie.mvpdemo.presenter;

import com.bwie.mvpdemo.bean.LoginInfo;
import com.bwie.mvpdemo.model.LoginModel;
import com.bwie.mvpdemo.view.IMainView;
import com.google.gson.Gson;
/**
 * MVP当中的P层  :连接M与V的桥梁
 */
public class LoginPresenter implements ILoginPresenter{
    private IMainView iMainView;
    private LoginModel loginModel;
   public LoginPresenter(IMainView iMainView){
        this.iMainView = iMainView;
        loginModel = new LoginModel();
    }
    @Override
    public void login(String mobile, String password) {
        loginModel.login(mobile,password,this);
    }
    @Override
    public void onFailed(String msg) {
        if(null == iMainView)
        {
            return;
        }
            iMainView.onFailed(msg);
    }
    @Override
    public void onSccuess(Object o) {
        //判空处理
        if(null == iMainView){
            return;
        }
        //iMainView.onSuccess(o);
        Gson gson = new Gson();
        LoginInfo loginInfo = gson.fromJson(o.toString(), LoginInfo.class);
        String code = loginInfo.getCode();
        if("0".equals(code)){
            iMainView.onSuccess(loginInfo.getMsg());
        }else{
            iMainView.onFailed(loginInfo.getMsg());
        }
    }
    @Override
    public void onDestory() {
        if(null != iMainView){
            iMainView = null;
        }
    }
}

10、view包下的IMainView

package com.bwie.mvpdemo.view;
/**
 * Created by rookie on 2018/1/5.
 */
public interface IMainView {
    void onFailed(String msg);
    void onSuccess(Object o);
}

11、view包下的MainActivity(主界面)

package com.bwie.mvpdemo.view;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.bwie.mvpdemo.R;
import com.bwie.mvpdemo.presenter.LoginPresenter;
/**
 * MVP 当中V 层 相当于android 项目当中Activity、Fragment
 */
public class MainActivity extends AppCompatActivity implements IMainView{
    private EditText etMobile;
    private EditText etPassword;
    private LoginPresenter loginPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        etMobile = findViewById(R.id.etMobile);
        etPassword = findViewById(R.id.etPassword);
        //创建Preseneter层的对象
        loginPresenter = new LoginPresenter(this);
    }
    public void btnLogin(View view){
        //获取输入框里面的数据
        String mobile = etMobile.getText().toString();
        String password = etPassword.getText().toString();
        loginPresenter.login(mobile,password);
    }
    @Override
    public void onFailed(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onSuccess(Object o) {
        //显示操作
        Toast.makeText(this, o.toString(), Toast.LENGTH_SHORT).show();
        //跳转主页Activity
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解绑,防止内存泄露
        loginPresenter.onDestory();
    }
}