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结合使用
- Android详细的登录注册功能MVP+Rxjava2.0+Retrofit2.0相结合的实战篇章
- Android:这是一份非常详细的MVP+Rxjava2.0+Retrofit2.0相结合举例RecyclerView的实战篇章
- Android 使用MVP Rxjava2+Retrofit2+Dagger2写的一个登录注册(含后台+数据库)的demo
- Android RxJava+Retrofit2.0+MVP的小试牛刀
- 【Android高级】RxJava2.0和Retrofit2.0的使用探究
- Android 优雅的让RxJava2.0+Retrofit2.0结合使用
- Android 优雅的让RxJava2.0+Retrofit2.0结合使用
- Retrofit2.0+Rxjava2 相关的文章
- RxJava2和Retrofit2.0的简单使用
- android Retrofit2.0 RxJava2.0
- Mvp+RxJava2+Retrofit2 搭建一个属于自己的开发框架
- Mvp+RxJava2+Retrofit2 搭建一个属于自己的开发框架
- Mvp+Retrofit2+RxJava2 项目中使用的简洁封装
- Mvp+Retrofit2+RxJava2 项目中使用的简洁封装
- Retrofit2.0+Rxjava2.0+MVP使用小记(一)
- Android中RxJava+Retrofit2.0+MVP模式的整合
- Android中RxJava+Retrofit2.0+MVP模式的整合
- Android中RxJava+Retrofit2.0+MVP模式的整合
- id_rsa.pub的作用和获取id_rsa.pub
- 判断程序是否运行在虚拟机中的代码
- 通过adb和shell 怎样获取Android设备已安装的App
- 《看透springMVC源码》之Tomcat的顶级结构及启动过程
- 运维必备知识
- Android详细的登录注册功能MVP+Rxjava2.0+Retrofit2.0相结合的实战篇章
- Spring Boot + H2 自动建表不支持多单词驼峰命名的问题
- 数据降维处理:PCA之特征值分解法例子解析
- Eclipse官方下载步骤
- java并发编程之进程与线程的区别(一)
- POJO和javabean的异同
- 打破平庸(Beating The Averages)
- Linux使用细节
- 详解$(document).ready与window.onload