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();
}
}