MVP OkHttp 登录注册



使用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'






猜你喜欢

转载自blog.csdn.net/melect/article/details/80042084