1. 程式人生 > >Rxjava MVP 登入註冊

Rxjava MVP 登入註冊

一:根據相關介面生成相應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);

    }
}