Android详细的登录注册功能MVP+Rxjava2.0+Retrofit2.0相结合的实战篇章

来源:互联网 发布:淘宝简约男装店铺推荐 编辑:程序博客网 时间:2024/06/08 03:49

登录注册功能MVP+Rxjava+Retrofit

1.就是需要从V层获得输入框的账号密码 通过P层返回给M层作为请求的参数
2.然后M层进行网络请求之后再将请求结果通过P层返回给V层 通过这个结果值判断是否登录或注册成功等状态…

无非就是在V层多写两个返回值的方法 返回用户输入框的值作为请求的参数罢了


那么实战项目中MVP+Rxjava2.0+Retrofit2.0有一个重要的类和一个接口
Cantranct:mvp这三个接口的总类 都放在这个类里 清晰和规范
APIInterface:API接口的总类 Retrofit请求的接口全放在这个里面

分包情况如下
这里写图片描述
我举例的这个接口的服务器端有点问题 请求非常非常慢 所以 换上你们的接口 我只是用这个举例一下 代码看注释!注释写的很详细了!
接口: http://172.17.29.27/quarter/user/addLogin
接口参数:
密码: userPassword 类型 varchar
手机号: userPhone 类型 varchar
返回:失败: 500 成功:200 类型 int

网络权限

 <uses-permission android:name="android.permission.INTERNET" />

依赖

 //Retrofit的依赖    compile 'com.squareup.retrofit2:retrofit:2.3.0'    compile 'com.squareup.okhttp3:okhttp:3.9.0'    compile 'com.squareup.retrofit2:converter-gson:2.3.0'    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'    //RxJava2的依赖    compile 'io.reactivex.rxjava2:rxjava:+'    compile 'io.reactivex.rxjava2:rxandroid:+'    compile 'com.squareup.okhttp3:logging-interceptor:3.9.0'

创建api包 创建APIInterface接口

import io.reactivex.Observable;import retrofit2.http.Field;import retrofit2.http.FormUrlEncoded;import retrofit2.http.POST;/** * Created by wxy on 2017/12/6. * API 所有的请求都写在此类 */public interface APIInterface {    //接口地址    //String url = "http://172.17.29.27/quarter/user/addLogin";    //接口参数    //参数:密码   userPassword   类型 varchar    //参数:手机号  userPhone  类型 varchar    //返回 失败: 500   成功:200    //post请求    @FormUrlEncoded    @POST("quarter/user/addLogin")    // 有Bean类的泛型里写Bean类       // 注释里的参数名要与接口的参数名一致    Observable<Object> getAPIData(@Field("userPassword") String password, @Field("userPhone") String phone);}

创建cantranct包 创建Cantranct类

/** * Created by wxy on 2017/12/6. * mvp各接口的总类 */public class Cantranct {    //M层接口及方法: 获取数据    public interface IModel {        //M层获取请求数据的方法 方法参数是下面的接口对象。和从V层输入框输入的内容(手机号和密码) 作为请求的参数        void model(CallBack callBack, String phone, String passwrod);        //M层获取到请求登录或注册的返回值之后 存入这个接口的方法然后把请求结果回调给P层        interface CallBack {            //方法的参数保存m层获取到的网络请求的结果 然后回调给P层            void callData(int code);        }    }    //P层接口及方法:M和V层的交互等逻辑(其实P层写不写接口都可以 用接口显得统一规范)    public interface IPresenter {        void presenter();    }    //V层接口 :获取输入框的值 获取到的值就是网络请求登录或注册的参数    //          接收网络请求后的返回值    public interface IView {        //返回在输入框输入的手机号        String phone();        //返回在输入框输入的密码        String password();        //方法的参数用于接收在P层里通过M层网络请求获取到返回值 判断是否登录或注册成功了        void view(int code);    }}

创建model包 创建Model类

import com.example.mydemo.api.APIInterface;import com.example.mydemo.cantranct.Cantranct;import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;import io.reactivex.Observer;import io.reactivex.android.schedulers.AndroidSchedulers;import io.reactivex.disposables.Disposable;import io.reactivex.schedulers.Schedulers;import retrofit2.Retrofit;import retrofit2.converter.gson.GsonConverterFactory;/** * Created by wxy on 2017/12/6. * M层 请求数据 从P层得到V层输入框的手机号和密码 作为参数请求 然后将请求结果回调通过P层给V层 */public class Model implements Cantranct.IModel {    private String baseUrl = "http://172.17.29.27/";    @Override    public void model(final CallBack callBack, String phone, String passwrod) {        Retrofit retrofit = new Retrofit.Builder().baseUrl(baseUrl)                .addConverterFactory(GsonConverterFactory.create())                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())                .build();        APIInterface apiInterface = retrofit.create(APIInterface.class);        //将从V层输入框中获取的手机号和密码 传入API的请求方法参数中        apiInterface.getAPIData(phone, passwrod)                //被观察者线程                .subscribeOn(Schedulers.io())                //观察者线程                .observeOn(AndroidSchedulers.mainThread())                //订阅                .subscribe(new Observer<Object>() {                    @Override                    public void onSubscribe(Disposable d) {                    }                    @Override                    public void onNext(Object o) {                        int code = (int) o;                        //将请求码传入接口中 通过P层回调给V层                        callBack.callData(code);                    }                    @Override                    public void onError(Throwable e) {                        //自己随地定义一个返回值                        callBack.callData(0);                    }                    @Override                    public void onComplete() {                    }                });    }}

创建presenter包 创建Presenter类

import com.example.mydemo.cantranct.Cantranct;import com.example.mydemo.model.Model;/** * Created by wxy on 2017/12/6. * P层 用于M、V的交互的逻辑 从V层获取输入的信息交给M层作为请求参数 然后M发起网络请求获得请求结果 再返回给V */public class Presenter implements Cantranct.IPresenter {    //创建M层对象    private Model model;    //创建V层接口的对象    private Cantranct.IView iView;    //构造方法的参数为V层的接口对象    public Presenter(Cantranct.IView iView) {        //待会展示数据的类实现V接口 创建P层的时候 将本身传进来 也就是说P层和展示数据的类他俩使用的是共同的一个V层接口 自然这个V层接口方法里的数据就可以共用了        this.iView = iView;        //创建M层的时候自然运行M层实现的请求数据方法 现在可以理解为已经请求到了数据        model = new Model();    }    @Override//在这个方法里进行M层和V层的交互    public void presenter() {        //M层创建保存请求结果的callback接口对象 这个接口里方法的参数就是请求的结果值        model.model(new Cantranct.IModel.CallBack() {            @Override            public void callData(int code) {                //然后再用V层接口对象保存请求结果 在V层里做判断是否登录或注册成功                iView.view(code);            }            //将V层输入框的密码和手机号 返回给M层 用于网络请求的参数        }, iView.password(), iView.phone());    }}

创建View包 创建Activity类

import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import com.example.mydemo.R;import com.example.mydemo.cantranct.Cantranct;import com.example.mydemo.presenter.Presenter;/** * V层 从输入框中得到信息 通过P层给M层作为网络请求的参数  M层发起网络请求之后再将请求结果通过P层返回给V层 V层在通过这个返回值结果进行处理等操作... * 实现V层接口 */public class MainActivity extends AppCompatActivity implements Cantranct.IView {    private EditText phone;    private EditText pass;    private Button bt;    private TextView tv;    private Presenter presenter;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        phone = (EditText) findViewById(R.id.phone);        pass = (EditText) findViewById(R.id.pass);        bt = (Button) findViewById(R.id.bt);        //确定登录或注册按钮 在这个监听里做EditText输入框的一些判断 不为空才发起请求等等...        bt.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                presenter = new Presenter(MainActivity.this);                //调用P层的方法 M层就会开始请求                presenter.presenter();                //将Text显示出来                tv.setVisibility(View.VISIBLE);            }        });        tv = (TextView) findViewById(R.id.tv);    }    @Override//将输入的手机号返回  作为网络请求手机号的参数    public String phone() {        return phone.getText().toString();    }    @Override//将输入的密码返回   作为网络请求密码的参数    public String password() {        return pass.getText().toString();    }    @Override//获得请求的结果    public void view(int code) {        if (code == 200) {            tv.setText("登录成功!");            Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();        } else if (code == 500) {            tv.setText("登录失败 密码或账号有误!");            Toast.makeText(this, "密码或账号有误", Toast.LENGTH_SHORT).show();        } else if (code == 0) {            Toast.makeText(this, "服务器卡顿 请稍等...", Toast.LENGTH_SHORT).show();            //服务器卡顿 重新请求            presenter.presenter();        }    }}

以上就是整个MVP+Rxjava+Retrofit的登录注册的实战结合

其实就是多了返回输入框信息作为请求参数的一步
返回输入的信息作为参数发起请求之后 再获得请求的结果
好好练习练习就明白了

下面是布局文件 想要练习这个Demo的可以复制下 但是把接口换了 这个接口连接很慢很慢

activity_main

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"    android:padding="20dp"    tools:context="com.example.mydemo.view.MainActivity">    <EditText        android:id="@+id/phone"        android:layout_width="match_parent"        android:layout_height="50dp"        android:hint="输入手机号" />    <EditText        android:id="@+id/pass"        android:layout_width="match_parent"        android:layout_height="50dp"        android:layout_alignParentStart="true"        android:layout_below="@+id/phone"        android:layout_marginTop="12dp"        android:hint="输入密码" />    <Button        android:id="@+id/bt"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_alignParentStart="true"        android:layout_below="@+id/pass"        android:layout_marginTop="18dp"        android:text="注册" />    <TextView        android:id="@+id/tv"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_alignParentStart="true"        android:layout_below="@+id/bt"        android:layout_marginStart="8dp"        android:layout_marginTop="80dp"        android:gravity="center"        android:text="正在请求..."        android:textSize="18sp"        android:visibility="gone" /></RelativeLayout>

下面是Rxjava和Retrofit的链接

Retrofir2.0的简单使用
Rxjava
Rxjava2.0和Retrofit2.0结合使用

阅读全文
0 0
原创粉丝点击