OKhttp+2次封装+mvp 登录注册

OKhttp回调接口

public interface OnNetListener {
    void onSuccess(String result);

    void onFailed(Exception e);
}

OKhttp封装类 ,封装了get和post请求

public class OkhttpUtils {
    //private static OkhttpUtils okhttpUtils = new OkhttpUtils();//饿汉式
    private static OkhttpUtils instance;
    private final OkHttpClient okHttpClient;
    private final Handler handler;

    //构造方法要私有化
    private OkhttpUtils() {
        //创建OkhttpClient对象
        okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(15, TimeUnit.SECONDS)//连接超时
                .writeTimeout(20, TimeUnit.SECONDS)//写入超时
                .readTimeout(20, TimeUnit.SECONDS)//读取超时
                .build();
        handler = new Handler(Looper.getMainLooper());
    }
    //单例模式
    //懒汉式
    public static OkhttpUtils getInstance() {
        if (instance == null) {
            instance = new OkhttpUtils();
        }
        return instance;
    }
    /*饿汉式
        public static OkhttpUtils getInstance(){
            return okhttpUtils;
        }*/

    /**
     * GET请求
     *
     * @param url
     */
    public void doGet(String url, final OnNetListener onNetListener) {
        //创建Request
        final Request request = new Request.Builder()
                .url(url)
                .build();
        //发送请求
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        onNetListener.onFailed(e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //拿到服务器返回的数据
                final String string = response.body().string();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        onNetListener.onSuccess(string);
                    }
                });
            }
        });
    }

    /**
     * doget 请求
     *
     * @param url
     * @param params
     * @param onNetListener
     */
    public void doGet(String url, Map<String, String> params, final OnNetListener onNetListener) {
        //判断params是否为null
        if (params != null) {
            StringBuilder sb = new StringBuilder();
            sb.append("?");
            //拼接参数
            for (Map.Entry<String, String> entry : params.entrySet()) {
                sb.append(entry.getKey());
                sb.append("=");
                sb.append(entry.getValue());
                sb.append("&");
            }
            //?mobile=12354678954&password=123456&
            String s = sb.toString();
            String strParam = s.substring(0, s.length() - 1);
            url += strParam;
            Log.e("sdfasdf", "url = " + url);
        }
        //创建Request对象
        Request request = new Request.Builder().url(url).build();
        //发送请求
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        onNetListener.onFailed(e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String string = response.body().string();
                Log.e("MainActivity", "string = " + string);
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        onNetListener.onSuccess(string);
                    }
                });
            }

        });
    }

    /**
     * dopsot 请求
     *
     * @param url
     * @param params
     * @param onNetListener
     */
    public void doPost(String url, Map<String, String> params, final OnNetListener onNetListener) {
        if (params != null) {
            //创建FormBody用于封装参数
            FormBody.Builder fBuilder = new FormBody.Builder();
            for (Map.Entry<String, String> entry : params.entrySet()) {
                fBuilder.add(entry.getKey(), entry.getValue());
            }
            FormBody formBody = fBuilder.build();
            Request.Builder builder = new Request.Builder();
            builder.url(url);
            builder.post(formBody);
            //创建Request
            Request request = builder.build();
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, final IOException e) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            onNetListener.onFailed(e);
                        }
                    });
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    final String string = response.body().string();
                    Log.e("MainActivity", "string = " + string);
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            onNetListener.onSuccess(string);
                        }
                    });
                }
            });
        }
    }
}

为了灵活调用接口

/**
 * Created by zhangjunyou on 2018/4/13.
 */

public class Api {
    //https://www.zhaoapi.cn/
    public static final String MY_ADDRESS = "https://www.zhaoapi.cn/";

    public static final String LOGIN_URL = MY_ADDRESS + "user/login";
    public static final String REGISTER_URL = MY_ADDRESS + "user/reg";
    /**
     * 正则表达式:验证密码
     */
    public static final String REGEX_PASSWORD = "^[a-zA-Z0-9]{6,20}$";

    /**
     * 正则表达式:验证手机号
     */
    public static final String REGEX_TEL = "^((17[0-9])|(14[0-9])|(13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";

    
}

验证方法

/**
 * Created by zhangjunyou on 2018/4/13.
 */

public class Aerifly {
    //手机号验证
    public static boolean isMobile(Context content, String tel) {

        if (tel.matches(Api.REGEX_TEL)) {

        } else {
            Toast.makeText(content, "手机号码格式不正确", Toast.LENGTH_SHORT).show();
            return false;
        }
        return true;
    }

    //密码验证
    public static boolean isPassword(Context content, String pwd) {
        if (pwd.matches(Api.REGEX_PASSWORD)) {

        }else {
            Toast.makeText(content, "密码长度为6-20位不能包含特殊字符", Toast.LENGTH_SHORT).show();
            return false;
        }
        return true;

    }
}

登录

model层回调接口

public interface ILoginModel {

    void login(String mobile, String password, ILoginPersenter iLoginPersenter);
}

model实现类

public class LoginModel implements ILoginModel {
    @Override
    public void login(String mobile, String password, final ILoginPersenter iLoginPersenter) {
        String url = Api.LOGIN_URL + "?mobile=" + mobile + "&password=" + password;

        OkhttpUtils.getInstance().doGet(url, new OnNetListener() {
            @Override
            public void onSuccess(String result) {
                LoginBean loginBean = new Gson().fromJson(result, LoginBean.class);
                if ("0".equals(loginBean.getCode())) {
                    iLoginPersenter.onSuccess(result);
                }
            }

            @Override
            public void onFailed(Exception e) {
                iLoginPersenter.onFailed(e + "");
            }
        });
    }
}

presenter层回调接口

public interface ILoginPersenter {

    void login(String mobile, String password);
    void onFailed(String str);
    void onSuccess(Object o);
    void onDestory();
}

presenter层实现类

public class LoginPersenter implements ILoginPersenter {

    private ILoginActivity iLoginActivity;
    private ILoginModel loginModel;

    public LoginPersenter(ILoginActivity iLoginActivity) {
        this.iLoginActivity = iLoginActivity;
        loginModel = new LoginModel();
    }

    @Override
    public void login(String mobile, String password) {
        //判断
        boolean mob = Aerifly.isMobile(MyApp.context, mobile);
        boolean pwd = Aerifly.isPassword(MyApp.context, password);
        if (mob && pwd) {
            loginModel.login(mobile, password, this);
        }
    }

    @Override
    public void onFailed(String str) {
        if (null == iLoginActivity) {
            return;
        }
        iLoginActivity.onFailed(str);
    }

    @Override
    public void onSuccess(Object o) {
        if (null == iLoginActivity) {
            return;
        }
        String result = o.toString();
        Gson g = new Gson();
        LoginBean supperClass = g.fromJson(result, LoginBean.class);
        String code = supperClass.getCode();
        if (code.equals("0")) {
            iLoginActivity.onSuccess(result);
        } else {
            iLoginActivity.onFailed(supperClass.getMsg());
        }
    }

    @Override
    public void onDestory() {
        if (null != iLoginActivity) {
            iLoginActivity = null;
        }
    }
}

view层回调接口

public interface ILoginActivity {
    void onFailed(String str);
    void onSuccess(Object o);
}

view层实现类

public class LoginActivity extends AppCompatActivity implements View.OnClickListener, ILoginActivity {

    /**
     * 请输入手机号
     */
    private EditText mTel;
    /**
     * 请输入密码
     */
    private EditText mPwd;
    /**
     * 登录
     */
    private Button mLogin;
    /**
     * 注册
     */
    private Button mReg;
    private LoginPersenter loginPersenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        initView();
    }

    private void initView() {
        mTel = (EditText) findViewById(R.id.tel);
        mPwd = (EditText) findViewById(R.id.pwd);
        mLogin = (Button) findViewById(R.id.login);
        mLogin.setOnClickListener(this);
        mReg = (Button) findViewById(R.id.reg);
        mReg.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            default:
                break;
            case R.id.login:
                String mobile = mTel.getText().toString();
                String password = mPwd.getText().toString();
                loginPersenter.login(mobile, password);
                break;
            case R.id.reg:
                Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
                startActivity(intent);
                break;
        }
    }

    @Override
    public void onFailed(String str) {
        Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onSuccess(Object o) {
        if (bundle != null) {
            setResult(RESULT_CANCELED, this.getIntent().putExtras(bundle));
            LoginActivity.this.finish();
        }
    }
}

xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_login"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".show.mine.login.view.LoginActivity">

    <EditText
        android:id="@+id/tel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入手机号"
        android:gravity="center_horizontal"
        android:layout_marginTop="50dp"
        android:textSize="24dp" />

    <EditText
        android:id="@+id/pwd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码"
        android:gravity="center_horizontal"
        android:layout_marginTop="30dp"
        android:textSize="24dp" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="100dp"
        >
        <Button
            android:id="@+id/login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:text="登录"
            />
        <Button
            android:id="@+id/reg"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:text="注册"
            />
    </LinearLayout>
  
</LinearLayout>

注册

注册model回调接口

public interface IRegisterModel {
    void Register(String mobile, String password, IRegisterPersenter iLoginPersenterTwo);
}

注册model实现类

public class RegisterModel implements IRegisterModel {
    @Override
    public void Register(String mobile, String password, final IRegisterPersenter iRegisterPersenter) {
        String url = Api.REGISTER_URL + "?mobile=" + mobile + "&password=" + password;
        OkhttpUtils.getInstance().doGet(url, new OnNetListener() {
            @Override
            public void onSuccess(String result) {
                LoginBean loginBean = new Gson().fromJson(result, LoginBean.class);
                if ("0".equals(loginBean.getCode())) {
                    iRegisterPersenter.onSuccess(result);
                }
            }

            @Override
            public void onFailed(Exception e) {
                iRegisterPersenter.onFailed(e + "");
            }
        });
    }
}

注册presenter回调接口

public interface IRegisterPersenter {
    void login(String mobile, String password);
    void onFailed(String str);
    void onSuccess(Object o);

    void onDestory();
}

注册presenter实现类

public class RegisterPersenter implements IRegisterPersenter {

    IRegister iRegister;
    IRegisterModel iRegisterModel;

    public RegisterPersenter(IRegister iRegister) {
        this.iRegister = iRegister;
        iRegisterModel = new RegisterModel();
    }

    @Override
    public void login(String mobile, String password) {
        //判断
        boolean mob = Aerifly.isMobile(MyApp.context, mobile);
        boolean pwd = Aerifly.isPassword(MyApp.context, password);
        if (mob && pwd) {
            iRegisterModel.Register(mobile, password, this);
        }
    }

    @Override
    public void onFailed(String str) {
        if (iRegister == null) {
            return;
        }

        iRegister.onFailed(str);
    }

    @Override
    public void onSuccess(Object o) {
        if (null == iRegister) {
            return;
        }

        iRegister.onSuccess(o.toString());

    }

    @Override
    public void onDestory() {
        if (null != iRegister) {
            iRegister = null;
        }
    }
}

注册view回调接口

public interface IRegister {
    void onFailed(String s);
    void onSuccess(Object o);
}

注册view实现类

public class RegisterActivity extends AppCompatActivity implements View.OnClickListener,IRegister {

    /**
     * 请输入电话号
     */
    private EditText mEtMobile;
    /**
     * 请输入密码
     */
    private EditText mEtPass;
    /**
     * 立即注册
     */
    private Button mBtnRegisterNow;
    private RegisterPersenter registerPersenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        initView();
    }

    private void initView() {
        mEtMobile = (EditText) findViewById(R.id.et_mobile);
        mEtPass = (EditText) findViewById(R.id.et_pass);
        mBtnRegisterNow = (Button) findViewById(R.id.btn_registerNow);
        mBtnRegisterNow.setOnClickListener(this);
        registerPersenter = new RegisterPersenter(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            default:
                break;
            case R.id.btn_registerNow:
                String mobile = mEtMobile.getText().toString();
                String pass = mEtPass.getText().toString();
                registerPersenter.login(mobile,pass);
                break;
        }
    }

    @Override
    public void onFailed(String s) {

    }

    @Override
    public void onSuccess(Object o) {
        String result = o.toString();
        Gson g = new Gson();
        RegBean supperClassTwo = g.fromJson(result, RegBean.class);
        String code = supperClassTwo.getCode();
        if (code.equals("0")) {
            Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
            startActivity(intent);
            Toast.makeText(this, supperClassTwo.getMsg(), Toast.LENGTH_SHORT).show();
            finish();
        } else {
            Toast.makeText(this, supperClassTwo.getMsg(), Toast.LENGTH_SHORT).show();
        }
    }
}

注册xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_register"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="注册界面"
        android:gravity="center"
        android:textSize="25sp"
        android:textColor="#000000"/>


    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入电话号"
        android:id="@+id/et_mobile"
        android:layout_marginTop="80dp"
        android:padding="10dp"
        />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码"
        android:inputType="textPassword"
        android:id="@+id/et_pass"
        android:layout_marginTop="80dp"
        />

    <Button
        android:id="@+id/btn_registerNow"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:text="立即注册"
        />
</LinearLayout>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值