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>