使用mvp框架、okHttp网络请求做一个登录注册功能
将MVP框架真正的使用起来,
添加okHttp的依赖,
OkHttp二次封装 单例:
public class OkHttp implements Callback { private static OkHttp INSTANCE; private OkHttpClient okHttpClient; private OkHttpCallBack mokHttpCallBack; private OkHttp(){ okHttpClient = new OkHttpClient.Builder().build(); } public static OkHttp getINSTANCE(){ if(INSTANCE == null){ INSTANCE = new OkHttp(); } return INSTANCE; } public void doGet(String path,OkHttpCallBack okHttpCallBack){
this.mokHttpCallBack = okHttpCallBack;
Request request = new Request.Builder().url(Constant.BASE_Url+path).build(); Call call = okHttpClient.newCall(request); call.enqueue(this); // // return "Error"; } public void doPost(String path, HashMap<String,String> map, OkHttpCallBack okHttpCallBack){ this.mokHttpCallBack = okHttpCallBack; FormBody.Builder builder = new FormBody.Builder(); Iterator<String> iterator = map.keySet().iterator(); while (iterator.hasNext()){ String key = iterator.next(); String value = map.get(key); builder.add(key,value); } FormBody formBody = builder.build(); Request request = new Request.Builder() .url(Constant.BASE_Url+path) .post(formBody) .build(); Call call = okHttpClient.newCall(request); call.enqueue(this); } @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String str = response.body().string(); mokHttpCallBack.onSuccess(str); } }
OkHttpCallBack的接口中:
public interface OkHttpCallBack { void onSuccess(String str); void onFail(int errCode,String errMsg); }
以下是Mvp框架的内容:
Presenter中的MainPresenter:
public class MainPresenter extends BasePresenter<IMainView> { private final OkHttp okHttp; public MainPresenter() { okHttp = OkHttp.getINSTANCE(); } public void login(String path, HashMap<String,String> hashMap){ okHttp.doPost(path, hashMap, new OkHttpCallBack() { @Override public void onSuccess(String str) { Log.e("TAG",str+"------"); getView().onSuccess(str); } @Override public void onFail(int errCode, String errMag) { } }); } public void apply(String path, HashMap<String,String> hashMap){ okHttp.doPost(path, hashMap, new OkHttpCallBack() { @Override public void onSuccess(String str) { Log.e("TAG",str+"====="); getView().onSuccess(str); } @Override public void onFail(int errCode, String errMag) { } }); } }
MainPresenter继承的BasePresenter:
public class BasePresenter<V extends IBaseView>{ private V mIBaseView; public void attachView(V IBaseView){ this.mIBaseView = IBaseView; } public V getView(){ return mIBaseView; } public void detachView(){ if(mIBaseView!=null){ mIBaseView = null; } } }
Activity中抽取的基类BaseActivity:
public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements IBaseView { public P presenter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); TApplication.getInstance().addActivity(this); setContentView(setChildContentView()); initView(); initBaseData(); initData(); } private void initBaseData(){ presenter = setPresenter(); if(presenter != null){ presenter.attachView(this); }else{ try { throw new Exception("错误"); } catch (Exception e) { e.printStackTrace(); } } }; abstract void initView(); abstract void initData(); abstract P setPresenter(); abstract int setChildContentView(); }
MainActivity登录注册:
public class MainActivity extends BaseActivity<MainPresenter> implements IMainView, View.OnClickListener { private EditText mob_edit, pas_edit; private Button login, apply; private String phoneNum; private String passwrd; private Login_bean loginBean = new Login_bean(); private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: Toast.makeText(MainActivity.this, loginBean.getMsg(), Toast.LENGTH_SHORT).show(); if (loginBean.getCode().equals("0")) { startActivity(new Intent(MainActivity.this, RclActivity.class)); finish(); } break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); } @Override void initView() { mob_edit = findViewById(R.id.mobile); pas_edit = findViewById(R.id.passwrod); login = findViewById(R.id.login); apply = findViewById(R.id.apply); apply.setOnClickListener(this); login.setOnClickListener(this); } @Override void initData() { } @Override MainPresenter setPresenter() { return new MainPresenter(); } @Override int setChildContentView() { return R.layout.activity_main; } @Override public void onSuccess(String str) { Gson gson = new Gson(); loginBean = gson.fromJson(str, Login_bean.class); handler.sendEmptyMessage(1); } @Override protected void onDestroy() { super.onDestroy(); presenter.detachView(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.login: phoneNum = mob_edit.getText().toString(); passwrd = pas_edit.getText().toString(); if (!CommonUtil.isMobileNO(phoneNum)) { Toast.makeText(MainActivity.this, getResources().getString(R.string.wrong_mobile_num), Toast.LENGTH_SHORT).show(); return; } if (passwrd == null || "".equals(passwrd)) { Toast.makeText(MainActivity.this, getResources().getString(R.string.wrong_password), Toast.LENGTH_SHORT).show(); return; } if (presenter != null) { String path = "user/login"; HashMap<String, String> hashMap = new HashMap<>(); hashMap.put("mobile", phoneNum); hashMap.put("password", passwrd); presenter.login(path, hashMap); } break; case R.id.apply: startActivity(new Intent(MainActivity.this, ApplyActivity.class)); break; } } }
ApplyActivity注册页面:
public class ApplyActivity extends BaseActivity<MainPresenter> implements IMainView, View.OnClickListener { private EditText mob_edit,pas_edit,pas_sure; private Button apply; private String mobile; private String passwrd,passwrd_sure; private Apply_bean applyBean = new Apply_bean(); private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(msg.what == 0){ Toast.makeText(ApplyActivity.this,applyBean.getMsg(),Toast.LENGTH_SHORT).show(); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_show); } @Override void initView() { mob_edit = findViewById(R.id.mobile); pas_edit = findViewById(R.id.passwrod); pas_sure = findViewById(R.id.passwrod_sure); apply = findViewById(R.id.apply); apply.setOnClickListener(this); } @Override void initData() { } @Override MainPresenter setPresenter() { return new MainPresenter(); } @Override int setChildContentView() { return R.layout.activity_show; } @Override public void onSuccess(String str) { Gson gson = new Gson(); applyBean = gson.fromJson(str, Apply_bean.class); handler.sendEmptyMessage(0); } @Override public void onClick(View v) { mobile = mob_edit.getText().toString(); passwrd = pas_edit.getText().toString(); passwrd_sure = pas_sure.getText().toString(); if(!CommonUtil.isMobileNO(mobile)) { Toast.makeText(this,getResources().getString(R.string.wrong_mobile_num),Toast.LENGTH_SHORT).show(); return; } if(passwrd == null || "".equals(passwrd)) { Toast.makeText(this,getResources().getString(R.string.wrong_password),Toast.LENGTH_SHORT).show(); return; } if(!passwrd.equals(passwrd_sure)){ Toast.makeText(this,getResources().getString(R.string.wrong_password_diff),Toast.LENGTH_SHORT).show(); return; } if(presenter != null) { String path = "quarter/register"; HashMap<String,String> hashMap = new HashMap<>(); hashMap.put("regType","0"); hashMap.put("mobile", mobile); hashMap.put("password", passwrd); presenter.apply(path,hashMap); } } }
RclActivity在这里是用来展示数据的,在此没有写什么东西:
public class RclActivity extends AppCompatActivity { private RecyclerView rcl; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_rcl); initView(); } private void initView() { rcl = findViewById(R.id.rclView); listView = findViewById(R.id.listView); } }
工具类:
正则表达式验证手机号
public static boolean isMobileNO(String mobiles){ Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$"); Matcher m = p.matcher(mobiles); return m.matches(); }
接口部分:
IBaseView是一个没有内容的接口
但他在mvp框架中扮演了一个将整个逻辑串联起来的重要作用
IMainView:
public interface IMainView extends IBaseView{ void onSuccess(String str); }
xml部分:
activity_main:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" tools:context=".View.activitys.MainActivity"> <LinearLayout android:layout_centerInParent="true" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <EditText android:id="@+id/mobile" android:hint="@string/mobile_text" android:layout_width="260dp" android:layout_height="wrap_content" /> <EditText android:id="@+id/passwrod" android:hint="@string/passwrod_text" android:inputType="textPassword" android:layout_marginTop="30dp" android:layout_width="260dp" android:layout_height="wrap_content" /> <Button android:id="@+id/login" android:layout_marginTop="50dp" android:text="@string/login" android:layout_gravity="center_horizontal" android:layout_width="200dp" android:layout_height="wrap_content" /> <Button android:id="@+id/apply" android:layout_width="200dp" android:text="@string/apply" android:layout_marginTop="30dp" android:layout_gravity="center_horizontal" android:layout_height="wrap_content" /> </LinearLayout> </RelativeLayout>
activity_show:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" tools:context=".View.activitys.ApplyActivity"> <LinearLayout android:layout_centerInParent="true" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <EditText android:id="@+id/mobile" android:hint="@string/mobile_text" android:layout_width="260dp" android:layout_height="wrap_content" /> <EditText android:id="@+id/passwrod" android:hint="@string/passwrod_text" android:inputType="textPassword" android:layout_marginTop="30dp" android:layout_width="260dp" android:layout_height="wrap_content" /> <EditText android:id="@+id/passwrod_sure" android:hint="@string/passwrod_text" android:inputType="textPassword" android:layout_marginTop="30dp" android:layout_width="260dp" android:layout_height="wrap_content" /> <Button android:id="@+id/apply" android:layout_width="200dp" android:text="@string/apply" android:layout_marginTop="30dp" android:layout_gravity="center_horizontal" android:layout_height="wrap_content" /> </LinearLayout> </RelativeLayout>
activity_rcl:
RecyclerView还没有加东西
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" tools:context=".View.activitys.RclActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/rclView" android:layout_width="match_parent" android:layout_height="wrap_content"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content"></ListView> </android.support.v7.widget.RecyclerView> </RelativeLayout>
依赖:
implementation 'com.squareup.okhttp3:okhttp:3.10.0' implementation 'com.google.code.gson:gson:2.2.4' implementation 'com.android.support:recyclerview-v7:27.1.1'