Rxjava MVP 登入註冊
阿新 • • 發佈:2019-01-03
一:根據相關介面生成相應bean類,要寫引數
二:寫介面Api
//登入
@GET("user/login")
Observable<LoginBean> loginData(@Query("mobile") String mobile, @Query("password") String password);
三:寫網路請求,具體程式碼請看上篇第四步
四:view層方法
public interface LoginView { void onLoginSuccess(LoginBean loginBean); void onError(LoginBean loginBean); }
五:model方法
public class LoginModel {
public Observable<LoginBean> login(String mobile, String password){
Api api = HttpUtils.getInstance().create(Api.class);
Observable<LoginBean> login = api.loginData(mobile, password);
return login;
}
}
六:presenter方法
public class LoginPresenter { private LoginView loginView; private final LoginModel loginModel; public LoginPresenter(LoginView loginView) { this.loginView = loginView; loginModel = new LoginModel(); } public void login(String mobile,String password){ loginModel.login(mobile, password) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<LoginBean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(LoginBean loginBean) { //Log.e("vvvvv",lieBean.getData().get(0).getTitle()+""); loginView.onLoginSuccess(loginBean); } @Override public void onError(Throwable e) { Log.e("ggggg",e+""); } @Override public void onComplete() { } }); } }
七:點選跳轉登入頁面的介面 xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent" tools:context=".MainActivity"> <com.facebook.drawee.view.SimpleDraweeView android:layout_width="50dp" android:layout_height="50dp" android:id="@+id/touxiang" android:layout_marginTop="20dp" android:layout_marginLeft="50dp" fresco:placeholderImage="@drawable/deng" fresco:roundAsCircle="true"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/login" android:text="登入/註冊" android:layout_marginLeft="50dp"/> </LinearLayout>
八:主頁面程式碼
public class MainActivity extends AppCompatActivity {
@BindView(R.id.touxiang)
SimpleDraweeView touxiang;
@BindView(R.id.login)
TextView login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
@OnClick({R.id.touxiang, R.id.login})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.touxiang:
break;
case R.id.login:
Intent intent = new Intent(MainActivity.this,LoginActivity.class);
startActivityForResult(intent, 999);
break;
}
}
//接收登入頁面傳過來的值以及第三方QQ登入
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 999 && resultCode == 1) {
String mobile = data.getExtras().getString("mobile");
login.setText(mobile);
}else {
if (requestCode == 999 && resultCode == 888) {
String name = data.getExtras().getString("name");
String iconurl = data.getExtras().getString("iconurl");
login.setText(name);
Uri parse = Uri.parse(iconurl);
touxiang.setImageURI(parse);
}
}
}
}
九:登入頁面佈局
<LinearLayout 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:orientation="vertical"
android:layout_height="match_parent"
tools:context=".LoginActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請輸入手機號"
android:layout_marginTop="20dp"
android:id="@+id/login_name" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請輸入密碼"
android:layout_marginTop="20dp"
android:id="@+id/login_pass" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="登入"
android:id="@+id/login_btn" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="簡訊驗證碼登入"
android:layout_marginLeft="10dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="新使用者註冊"
android:layout_marginLeft="10dp"
android:id="@+id/regis_btn"
android:layout_alignParentRight="true"
android:layout_marginRight="5dp"/>
</RelativeLayout>
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/koukou"
android:layout_gravity="center_horizontal"
android:layout_marginTop="70dp"
android:id="@+id/imgview_qq" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="QQ登入"
android:layout_gravity="center"
android:layout_marginTop="5dp"/>
</LinearLayout>
十:登入頁面的主程式碼
public class LoginActivity extends AppCompatActivity implements LoginView {
@BindView(R.id.login_name)
EditText loginName;
@BindView(R.id.login_pass)
EditText loginPass;
@BindView(R.id.login_btn)
Button loginBtn;
@BindView(R.id.regis_btn)
TextView regisBtn;
@BindView(R.id.imgview_qq)
ImageView imgviewQq;
private LoginPresenter loginPresenter;
private SharedPreferences sp;
private String name;
private String pass;
private UMShareAPI umShareAPI;
private String name1;
private String iconurl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ButterKnife.bind(this);
umShareAPI = UMShareAPI.get(this);
loginPresenter = new LoginPresenter(this);
}
@OnClick({R.id.login_btn, R.id.regis_btn, R.id.imgview_qq})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.login_btn:
name = loginName.getText().toString();
pass = loginPass.getText().toString();
loginPresenter.login(name, pass);
break;
case R.id.regis_btn:
Intent intent1 = new Intent(LoginActivity.this, RegisActivity.class);
startActivity(intent1);
finish();
break;
case R.id.imgview_qq:
UMAuthListener authListener = new UMAuthListener() {
/**
* @desc 授權開始的回撥
* @param platform 平臺名稱
*/
@Override
public void onStart(SHARE_MEDIA platform) {
}
/**
* @desc 授權成功的回撥
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
* @param data 使用者資料返回
*/
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
Toast.makeText(LoginActivity.this, "成功了", Toast.LENGTH_LONG).show();
//這裡要自己定義傳值和頭像
name1 = data.get("name");
iconurl = data.get("iconurl");
Intent intent2 = new Intent();
Bundle bundle = new Bundle();
bundle.putString("name", name1);
bundle.putString("iconurl", iconurl);
intent2.putExtras(bundle);
setResult(888, intent2);
finish();
}
/**
* @desc 授權失敗的回撥
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
* @param t 錯誤原因
*/
@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
Toast.makeText(LoginActivity.this, "失敗:" + t.getMessage(),Toast.LENGTH_LONG).show();
}
/**
* @desc 授權取消的回撥
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
*/
@Override
public void onCancel(SHARE_MEDIA platform, int action) {
Toast.makeText(LoginActivity.this, "取消了", Toast.LENGTH_LONG).show();
}
};
umShareAPI.getPlatformInfo(LoginActivity.this, SHARE_MEDIA.QQ, authListener);
break;
}
}
@Override
public void onLoginSuccess(LoginBean loginBean) {
Toast.makeText(this, loginBean.getMsg(), Toast.LENGTH_SHORT).show();
String code = loginBean.getCode();
String msg = loginBean.getMsg();
if (code.equals("0")) {
String mobile = loginBean.getData().getMobile();
String uid = String.valueOf(loginBean.getData().getUid());
sp = getSharedPreferences("config",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("mobile",mobile);
editor.putString("uid",uid);
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("mobile", mobile);
intent.putExtras(bundle);
setResult(1, intent);
finish();
}
}
@Override
public void onError(LoginBean loginBean) {
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
}
}
十一:註冊 首先寫介面Api 寫介面之前寫bean類
//註冊
@GET("user/reg")
Observable<RegisBean> RegData(@Query("mobile") String mobile, @Query("password") String password);
十二:註冊 view層方法
public interface RegisView {
void onRegSuccess(RegisBean regisBean);
void onErrorReg(RegisBean regisBean);
}
十三:註冊 model 方法
public class RegisModel {
public Observable<RegisBean> regis(String mobile, String password){
Api api = HttpUtils.getInstance().create(Api.class);
Observable<RegisBean> regis = api.RegData(mobile, password);
return regis;
}
}
十四:註冊 presenter方法
public class RegisPresenter {
private RegisView regisView;
private final RegisModel regisModel;
public RegisPresenter(RegisView regisView) {
this.regisView = regisView;
regisModel = new RegisModel();
}
public void register(String mobile,String password){
regisModel.regis(mobile, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<RegisBean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(RegisBean regisBean) {
//Log.e("vvvvv",lieBean.getData().get(0).getTitle()+"");
regisView.onRegSuccess(regisBean);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}
十五:註冊 activity 佈局
<LinearLayout 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:orientation="vertical"
tools:context=".RegisActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請輸入手機號"
android:layout_marginTop="20dp"
android:id="@+id/regis_name" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請輸入密碼"
android:layout_marginTop="20dp"
android:id="@+id/regis_pass" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="註冊"
android:id="@+id/zhuce" />
</LinearLayout>
十六:註冊 主頁面程式碼
public class RegisActivity extends AppCompatActivity implements RegisView {
@BindView(R.id.regis_name)
EditText regisName;
@BindView(R.id.regis_pass)
EditText regisPass;
@BindView(R.id.zhuce)
Button zhuce;
private RegisPresenter regisPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_regis);
ButterKnife.bind(this);
regisPresenter = new RegisPresenter(this);
}
@OnClick(R.id.zhuce)
public void onViewClicked() {
String name = regisName.getText().toString();
String pass = regisPass.getText().toString();
regisPresenter.register(name,pass);
}
@Override
public void onRegSuccess(RegisBean regisBean) {
Toast.makeText(this, regisBean.getMsg(), Toast.LENGTH_SHORT).show();
if (regisBean.getMsg().equals("註冊成功")){
Intent intent1=new Intent(RegisActivity.this,LoginActivity.class);
startActivity(intent1);
finish();
}
}
@Override
public void onErrorReg(RegisBean regisBean) {
}
}
十七:最後需在 APP 類 註冊 Fresco 和第三方QQ登入
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this);
//第三方QQ登入
UMConfigure.init(this,"5a12384aa40fa3551f0001d1"
,"umeng",UMConfigure.DEVICE_TYPE_PHONE,"");//58edcfeb310c93091c000be2 5965ee00734be40b580001a0
PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba");
UMConfigure.setLogEnabled(true);
}
}