retrofit+rxjava 登录注册


[html]  view plain  copy
  1. //entity bean类  
  2. public class BaseResponseEntity<T> {  
  3.   
  4.     public String code;//状态码:0,1  
  5.     public String msg;  
  6.     public T data;  
  7. }  
  8. public class User extends BaseResponseEntity {  
  9.   
  10.     public String mobile;  
  11.     public String nickname;  
  12.     public String age;  
  13.     public String appkey;  
  14.     public String appsecret;  
  15.     public String createtime;  
  16.     public String email;  
  17.     public String fans;  
  18.     public String follow;  
  19.     public String gender;  
  20.     public String icon;  
  21.     public String latitude;  
  22.     public String longitude;  
  23.     public String money;  
  24.     public String password;  
  25.     public String praiseNum;  
  26.     public String token;  
  27.     public String uid;  
  28.     public String userId;  
  29.     public String username;  
  30. }  


[html]  view plain  copy
  1. //utils 工具类  
  2. public class HttpConfig {  
  3.     //retrofit根目录  
  4.     public static final String _URL="http://120.27.23.105/";  
  5. }  
  6. ------  
  7. /**  
  8.  * Description:retrofit工具类  
  9.  * 构造者模式如何封装:首先有各种builder过程,最后通过build()方法对对象进行创建  
  10.  */  
  11. public class RetrofitUtils {  
  12.   
  13.     //创建私有属性  
  14.     private static RetrofitUtils mInstance;  
  15.     //创建ApiService引用  
  16.     private static ApiService apiService;  
  17.   
  18.     /**  
  19.      * 声明私有构造方法,类似于单利模式,让调用者无法new出对象,只能通过构造者模式创建对象  
  20.      */  
  21.     private RetrofitUtils() {  
  22.   
  23.     }  
  24.   
  25.     /**  
  26.      * 先后调用的过程,只有对象给build成功之后,才能调用apiservice,这也是retrofit的几个先后的步骤  
  27.      * @return  
  28.      */  
  29.     public ApiService getApiService() {  
  30.         return apiService;  
  31.     }  
  32.   
  33.     public static class Builder {  
  34.   
  35.         private OkHttpClient okHttpClient;  
  36.   
  37.         private List<CallAdapter.Factory> callAdapterFactorys = new ArrayList<>();  
  38.         private List<Converter.Factory> convertFactorys = new ArrayList<>();  
  39.   
  40.         public Builder addCallAdapterFactory(CallAdapter.Factory factory) {  
  41.             callAdapterFactorys.add(factory);  
  42.             return this;//返回this的目的是:可以链式调用  
  43.         }  
  44.   
  45.         public Builder addConverterFactory(Converter.Factory factory) {  
  46.             convertFactorys.add(factory);  
  47.             return this;  
  48.         }  
  49.   
  50.         public Builder client(OkHttpClient okHttpClient) {  
  51.             this.okHttpClient = okHttpClient;  
  52.             return this;  
  53.         }  
  54.   
  55.         /**  
  56.          * build方法才是真正的业务逻辑操作,才是真正构建对象的过程  
  57.          * @return  
  58.          */  
  59.         public RetrofitUtils build() {  
  60.   
  61.   
  62.             Retrofit.Builder builder = new Retrofit.Builder();  
  63.   
  64.             if (convertFactorys != null && convertFactorys.size() == 0) {  
  65.                 //如果集合中没有对象,我们添加默认的gson解析器  
  66.                 builder.addConverterFactory(GsonConverterFactory.create());  
  67.             }  
  68.   
  69.             for (Converter.Factory convertFactory : convertFactorys) {  
  70.                 builder.addConverterFactory(convertFactory);  
  71.             }  
  72.   
  73.             if (callAdapterFactorys != null && callAdapterFactorys.size() == 0) {  
  74.                 builder.addCallAdapterFactory(RxJava2CallAdapterFactory.create());  
  75.   
  76.             }  
  77.   
  78.             for (CallAdapter.Factory callAdapterFactory : callAdapterFactorys) {  
  79.                 builder.addCallAdapterFactory(callAdapterFactory);  
  80.             }  
  81.   
  82.             //第一步创建retrofit对象  
  83.             Retrofit retrofit = builder.client(okHttpClient).baseUrl(HttpConfig._URL)  
  84.                     .build();  
  85.             //第二步,创建apiservice接口类  
  86.             apiService = retrofit.create(ApiService.class);  
  87.             //第三步,请求逻辑(这个供外部调用者调用)  
  88.             mInstance = new RetrofitUtils();//私有构造方法,只有本类可以new出实例  
  89.             return mInstance;  
  90.         }  
  91.     }  
  92. }  


[html]  view plain  copy
  1. //ApiService  
  2. /**  
  3.  * Description:retrofit接口方法,先从广度分包,再从深度细化功能类  
  4.  * 实际在面试过程中,也是先从广度说起,再从深度挖掘,如果你刚开始就从深度挖掘,那么很容易挖的太深,给自己挖坑  
  5.  */  
  6. public interface ApiService {//接口类,只声明方法,不进行实现  
[html]  view plain  copy
  1. //get请求  
  2. /*@GET("product/getProductDetail?source=android")  
  3.     Observable<GoodDetailsBean> rxjavaGoodDetails(@Query("pid") String pid);*/  
  4.   
  5.  @POST("user/reg")  
  6.  @FormUrlEncoded Observable<BaseResponseEntity<User>> rxjavaReg(@FieldMap Map<String, String> params);  
  7.   
  8.  @POST("user/login")  
  9.  @FormUrlEncoded Observable<BaseResponseEntity<User>> rxjavaLogin(@FieldMap Map<String, String> params);  
  10. }  
[html]  view plain  copy
  1. //MVP模式  
  2.   
  3. //Model  
  4. public class LoginModel {  
  5.     /**  
  6.      * 请求登录接口(登录接口的网络请求,实际上就是进行网络请求,拿到请求后的json字符串)  
  7.      *  
  8.      * @param mobile  
  9.      * @param pass  
  10.      */  
  11.     public void login(String mobile, String pass, final LoginCallback loginCallback) {  
  12.   
  13.         Map<String, String> params = new HashMap<>();  
  14.         params.put("mobile", mobile);  
  15.         params.put("password", pass);  
  16.   
  17.         OkHttpClient okHttpClient = new OkHttpClient.Builder()  
  18.                 .addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))  
  19.                 .build();  
  20.   
  21.         Retrofit retrofit = new Retrofit.Builder()  
  22.                 .client(okHttpClient)//和okhttp关联,使用okhttp构造的一些功能,上面构建者模式,只构建了一个拦截器  
  23.                 .addConverterFactory(GsonConverterFactory.create())  
  24.                 .addCallAdapterFactory(RxJava2CallAdapterFactory.create())  
  25.                 .baseUrl(HttpConfig._URL).build();  
  26.   
  27.         ApiService apiService = retrofit.create(ApiService.class);  
  28.   
  29.         apiService.rxjavaLogin(params).subscribeOn(Schedulers.io())  
  30.                 .observeOn(AndroidSchedulers.mainThread())  
  31.                 .subscribe(new Observer<BaseResponseEntity<User>>() {  
  32.                     @Override  
  33.                     public void onSubscribe(Disposable d) {  
  34.   
  35.                     }  
  36.   
  37.                     @Override  
  38.                     public void onNext(BaseResponseEntity<User> value) {  
  39.   
  40.                         //retrofit的观察者的四个回调方法,都是运行在主线程(okhttp的回调是运行在子线程)  
  41.                         if (value.code.equals("0")) {  
  42.                             loginCallback.loginSuccess(value);  
  43.                         } else {  
  44.                             //密码错误,手机号不存在等各种登录错误问题  
  45.                             loginCallback.loginFail(value);  
  46.                         }  
  47.                     }  
  48.   
  49.                     @Override  
  50.                     public void onError(Throwable e) {  
  51.                         loginCallback.failure(e);  
  52.                     }  
  53.   
  54.                     @Override  
  55.                     public void onComplete() {  
  56.   
  57.                     }  
  58.                 });  
  59.     }  
  60.         public interface LoginCallback {  
  61.             void loginSuccess(BaseResponseEntity<User> user);//登录成功  
  62.   
  63.             void loginFail(BaseResponseEntity<User> user);//登录失败  
  64.   
  65.             void failure(Throwable t);//网络请求失败  
  66.         }  
  67.     }  
  68.   
  69. ------  
  70.   
  71. public class RegModel {  
  72.     /**  
  73.      * 请求登录接口(登录接口的网络请求,实际上就是进行网络请求,拿到请求后的json字符串)  
  74.      *  
  75.      * @param mobile  
  76.      * @param pass  
  77.      */  
  78.     public void reg(String mobile, String pass, final RegCallback regCallback) {  
  79.   
  80.         Map<String, String> params = new HashMap<>();  
  81.         params.put("mobile", mobile);  
  82.         params.put("password", pass);  
  83.   
  84.         OkHttpClient okHttpClient = new OkHttpClient.Builder()  
  85.                 .addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))  
  86.                 .build();  
  87.   
  88.         Retrofit retrofit = new Retrofit.Builder()  
  89.                 .client(okHttpClient)//和okhttp关联,使用okhttp构造的一些功能,上面构建者模式,只构建了一个拦截器  
  90.                 .addConverterFactory(GsonConverterFactory.create())  
  91.                 .addCallAdapterFactory(RxJava2CallAdapterFactory.create())  
  92.                 .baseUrl(HttpConfig._URL).build();  
  93.   
  94.         ApiService apiService = retrofit.create(ApiService.class);  
  95.   
  96.         apiService.rxjavaReg(params).subscribeOn(Schedulers.io())  
  97.                 .observeOn(AndroidSchedulers.mainThread())  
  98.                 .subscribe(new Observer<BaseResponseEntity>() {  
  99.                     @Override  
  100.                     public void onSubscribe(Disposable d) {  
  101.   
  102.                     }  
  103.   
  104.                     @Override  
  105.                     public void onNext(BaseResponseEntity value) {  
  106.   
  107.                         //retrofit的观察者的四个回调方法,都是运行在主线程(okhttp的回调是运行在子线程)  
  108.                         if (value.code.equals("0")) {  
  109.                             regCallback.regSuccess(value);  
  110.                         } else {  
  111.                             //密码错误,手机号不存在等各种登录错误问题  
  112.                             regCallback.regFail(value);  
  113.                         }  
  114.                     }  
  115.   
  116.                     @Override  
  117.                     public void onError(Throwable e) {  
  118.                         regCallback.failure(e);  
  119.                     }  
  120.   
  121.                     @Override  
  122.                     public void onComplete() {  
  123.   
  124.                     }  
  125.                 });  
  126.     }  
  127.         public interface RegCallback {  
  128.             void regSuccess(BaseResponseEntity user);//登录成功  
  129.   
  130.             void regFail(BaseResponseEntity user);//登录失败  
  131.   
  132.             void failure(Throwable t);//网络请求失败  
  133.         }  
  134.     }  
  135.   
  136. ---------------------------------------------  
  137. //Presenter  
  138.   
  139. /**  
  140.  * Description:控制器,逻辑层,需要连接model和view层  
  141.  */  
  142. public class LoginPresenter {  
  143.     private LoginModel loginModel;  
  144.     private ILoginView iLoginView;  
  145.   
  146.     public LoginPresenter(ILoginView iLoginView) {  
  147.         loginModel = new LoginModel();  
  148.         this.iLoginView = iLoginView;  
  149.     }  
  150.   
  151.   
  152.     /**  
  153.      * 做本地校验逻辑的方法  
  154.      *  
  155.      * @param mobile  
  156.      * @param pass   实际上校验本地的逻辑,需要一项非常重要的技术:正则表达式  
  157.      */  
  158.     public void login(String mobile, String pass) {  
  159.   
  160.         if (mobile.length() == 0) {//手机号有自己的规则,比如11位,186开头,校验这些数据必须通过正则表达式  
  161.             iLoginView.mobileError();  
  162.             return;  
  163.         }  
  164.   
  165.         if (TextUtils.isEmpty(pass.trim())) {//也就是输入框为空的时候  
  166.             iLoginView.passError();  
  167.             return;  
  168.         }  
  169.   
  170.   
  171. //走model层,进行数据处理  
  172.         loginModel.login(mobile, pass, new LoginModel.LoginCallback() {  
  173.             @Override  
  174.             public void loginSuccess(BaseResponseEntity<User> user) {  
  175.   
  176.                 iLoginView.loginSuccess(user);  
  177.   
  178.             }  
  179.   
  180.             @Override  
  181.             public void loginFail(BaseResponseEntity<User> user) {  
  182.   
  183.                 iLoginView.loginFailure(user);  
  184.   
  185.             }  
  186.   
  187.             @Override  
  188.             public void failure(Throwable t) {  
  189.   
  190.                 iLoginView.failure(t);  
  191.   
  192.             }  
  193.         });  
  194.     }  
  195. }  
  196.   
  197. -----  
  198.   
  199. /**  
  200.  * Description:控制器,逻辑层,需要连接model和view层  
  201.  */  
  202. public class RegPresenter {  
  203.     private RegModel regModel;  
  204.     private IRegView iRegView;  
  205.   
  206.     public RegPresenter(IRegView iRegView) {  
  207.   
  208.         regModel = new RegModel();  
  209.   
  210.         this.iRegView = iRegView;  
  211.   
  212.     }  
  213.   
  214.   
  215.     /**  
  216.      * 做本地校验逻辑的方法  
  217.      *  
  218.      * @param mobile  
  219.      * @param pass   实际上校验本地的逻辑,需要一项非常重要的技术:正则表达式  
  220.      */  
  221.     public void reg(String mobile, String pass) {  
  222.   
  223.         if (mobile.length() == 0) {//手机号有自己的规则,比如11位,186开头,校验这些数据必须通过正则表达式  
  224.             iRegView.mobileError();  
  225.             return;  
  226.   
  227.         }  
  228.   
  229.         if (TextUtils.isEmpty(pass.trim())) {//也就是输入框为空的时候  
  230.             iRegView.passError();  
  231.             return;  
  232.         }  
  233.   
  234.   
  235. //走model层,进行数据处理  
  236.         regModel.reg(mobile, pass, new RegModel.RegCallback() {  
  237.             @Override  
  238.             public void regSuccess(BaseResponseEntity user) {  
  239.   
  240.                 iRegView.regSuccess(user);  
  241.   
  242.             }  
  243.   
  244.             @Override  
  245.             public void regFail(BaseResponseEntity user) {  
  246.   
  247.                 iRegView.regFailure(user);  
  248.   
  249.             }  
  250.   
  251.             @Override  
  252.             public void failure(Throwable t) {  
  253.   
  254.                 iRegView.failure(t);  
  255.   
  256.             }  
  257.         });  
  258.     }  
  259. }  
  260.   
  261. -----------------------------------------  
  262. //View  
  263.   
  264. public interface ILoginView {  
  265.     void showProgressBar();//是否显示加载进度视图的方法  
  266.     void mobileError();//手机号为空或者不合法  
  267.     void passError();//密码为空或者不合法  
  268.     void loginSuccess(BaseResponseEntity<User> user);//网络请求成功,并且登录成功  
  269.     void loginFailure(BaseResponseEntity<User> user);//网络请求成功,但登录失败(有可能密码错误,有可能手机号错误)  
  270.     void failure(Throwable t);//网络请求失败(断网,服务器崩溃,接口地址不正确,弱网)  
  271. }  
  272.   
  273. ------  
  274.   
  275. public interface IRegView {  
  276.     void showProgressBar();//是否显示加载进度视图的方法  
  277.     void mobileError();//手机号为空或者不合法  
  278.     void passError();//密码为空或者不合法  
  279.     void regSuccess(BaseResponseEntity user);//网络请求成功,并且登录成功  
  280.     void regFailure(BaseResponseEntity user);//网络请求成功,但登录失败(有可能密码错误,有可能手机号错误)  
  281.     void failure(Throwable t);//网络请求失败(断网,服务器崩溃,接口地址不正确,弱网)  
  282. }  
  283.   
  284. -----  
  285.   
  286. public class MainActivity extends AppCompatActivity implements ILoginView,View.OnClickListener {  
  287.   
  288.     private LoginPresenter loginPresenter;  
  289.   
  290.   
  291.     private EditText mMobileEt,mPwdEt;  
  292.     private Button mLoginBtn,mRegisterBtn;  
  293.   
  294.     @Override  
  295.     protected void onCreate(Bundle savedInstanceState) {  
  296.         super.onCreate(savedInstanceState);  
  297.         setContentView(R.layout.activity_main);  
  298.   
  299.         init();  
  300.   
  301.     }  
  302.   
  303.     /**  
  304.      * 初始化方法  
  305.      */  
  306.     private void init() {  
  307.   
  308.         initView();  
  309.         initData();  
  310.     }  
  311.   
  312.     /**  
  313.      * 初始化数据  
  314.      */  
  315.     private void initData() {  
  316.   
  317.         loginPresenter = new LoginPresenter(this);  
  318.   
  319.     }  
  320.   
  321.     /**  
  322.      * 初始化控件  
  323.      */  
  324.     private void initView() {  
  325.   
  326.         mMobileEt = findViewById(R.id.mobile_et);  
  327.         mPwdEt = findViewById(R.id.password_et);  
  328.         mLoginBtn = findViewById(R.id.login_btn);  
  329.         mRegisterBtn = findViewById(R.id.reg_btn);  
  330.   
  331.         mLoginBtn.setOnClickListener(this);  
  332.         mRegisterBtn.setOnClickListener(this);  
  333.   
  334.     }  
  335.   
  336.     @Override  
  337.     public void showProgressBar() {  
  338.   
  339.     }  
  340.   
  341.     @Override  
  342.     public void mobileError() {  
  343.   
  344.         Toast.makeText(this, "手机号不能为空", Toast.LENGTH_SHORT).show();  
  345.   
  346.     }  
  347.   
  348.     @Override  
  349.     public void passError() {  
  350.         Toast.makeText(this, "密码不能为空", Toast.LENGTH_SHORT).show();  
  351.     }  
  352.   
  353.     @Override  
  354.     public void loginSuccess(BaseResponseEntity<User> user) {  
  355.   
  356.         Toast.makeText(this, user.msg, Toast.LENGTH_SHORT).show();  
  357.   
  358.     }  
  359.   
  360.     @Override  
  361.     public void loginFailure(BaseResponseEntity<User> user) {  
  362.   
  363.         Toast.makeText(this, user.msg, Toast.LENGTH_SHORT).show();  
  364.   
  365.     }  
  366.   
  367.     @Override  
  368.     public void failure(Throwable t) {  
  369.   
  370.         System.out.println("failure:"+t);  
  371.   
  372.     }  
  373.   
  374.     @Override  
  375.     public void onClick(View v) {  
  376.         switch (v.getId()){  
  377.             //点击登录按钮  
  378.             case R.id.login_btn:  
  379.   
  380.                 String mobile = mMobileEt.getText().toString();  
  381.                 String pass = mPwdEt.getEditableText().toString();  
  382.                 //需要通过控制器去处理逻辑  
  383.                 loginPresenter.login(mobile,pass);  
  384.   
  385.                 break;  
  386.             case R.id.reg_btn:  
  387.                startActivity(new Intent(MainActivity.this,RegActivity.class));  
  388.                 break;  
  389.         }  
  390.     }  
  391. }  
  392.   
  393. -----  
  394.   
  395. public class RegActivity extends AppCompatActivity implements IRegView,View.OnClickListener {  
  396.   
  397.         private RegPresenter regPresenter;  
  398.   
  399.   
  400.         private EditText mMobileEt,mPwdEt;  
  401.         private Button mRegisterBtn;  
  402.   
  403.         @Override  
  404.         protected void onCreate(Bundle savedInstanceState) {  
  405.             super.onCreate(savedInstanceState);  
  406.             setContentView(R.layout.activity_reg);  
  407.   
  408.             init();  
  409.   
  410.         }  
  411.   
  412.         /**  
  413.          * 初始化方法  
  414.          */  
  415.         private void init() {  
  416.   
  417.             initView();  
  418.             initData();  
  419.         }  
  420.   
  421.         /**  
  422.          * 初始化数据  
  423.          */  
  424.         private void initData() {  
  425.   
  426.             regPresenter = new RegPresenter(this);  
  427.   
  428.         }  
  429.   
  430.         /**  
  431.          * 初始化控件  
  432.          */  
  433.         private void initView() {  
  434.   
  435.             mMobileEt = findViewById(R.id.mobile_et);  
  436.             mPwdEt = findViewById(R.id.password_et);  
  437.             mRegisterBtn = findViewById(R.id.reg_btn);  
  438.   
  439.             mRegisterBtn.setOnClickListener(this);  
  440.   
  441.         }  
  442.   
  443.         @Override  
  444.         public void showProgressBar() {  
  445.   
  446.         }  
  447.   
  448.         @Override  
  449.         public void mobileError() {  
  450.   
  451.             Toast.makeText(this, "手机号不能为空", Toast.LENGTH_SHORT).show();  
  452.   
  453.         }  
  454.   
  455.         @Override  
  456.         public void passError() {  
  457.             Toast.makeText(this, "密码不能为空", Toast.LENGTH_SHORT).show();  
  458.         }  
  459.   
  460.         @Override  
  461.         public void regSuccess(BaseResponseEntity user) {  
  462.   
  463.             Toast.makeText(this, user.msg, Toast.LENGTH_SHORT).show();  
  464.             Log.d("有没有", user.msg);  
  465.         }  
  466.   
  467.         @Override  
  468.         public void regFailure(BaseResponseEntity user) {  
  469.   
  470.             Toast.makeText(this, user.msg, Toast.LENGTH_SHORT).show();  
  471.             Log.d("有没有", user.msg);  
  472.         }  
  473.   
  474.         @Override  
  475.         public void failure(Throwable t) {  
  476.   
  477.             System.out.println("failure:"+t);  
  478.   
  479.         }  
  480.   
  481.     @Override  
  482.     public void onClick(View v) {  
  483.                 String mobile = mMobileEt.getText().toString();  
  484.                 String pass = mPwdEt.getEditableText().toString();  
  485.                 //需要通过控制器去处理逻辑  
  486.                 regPresenter.reg(mobile,pass);  
  487.         }  
  488.     }  

[html]  view plain  copy
  1. //依赖  
  2.     compile 'io.reactivex.rxjava2:rxjava:2.0.1'  //Rxjava  
  3.     compile 'io.reactivex.rxjava2:rxandroid:2.0.1'  //Rx安卓  
  4.     compile 'com.squareup.retrofit2:retrofit:2.3.0' //Retrofit请求网络  
  5.     compile 'com.squareup.retrofit2:converter-gson:2.3.0'//Gson  
  6.     compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'  
  7.     compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'//拦截器  
  8.   
  9. //权限  
  10. <uses-permission android:name="android.permission.INTERNET" />  

猜你喜欢

转载自blog.csdn.net/frimary/article/details/80242968