【從 0 開始開發(fā)一款直播 APP】4.4 網(wǎng)絡(luò)封裝之 OkHttp -- 網(wǎng)絡(luò)請求實現(xiàn)直播登錄

本文為菜鳥窩作者蔣志碧的連載。“從 0 開始開發(fā)一款直播 APP ”系列來聊聊時下最火的直播 APP墙懂,如何完整的實現(xiàn)一個類"騰訊直播"的商業(yè)化項目
視頻地址:http://www.cniao5.com/course/10121


【從 0 開始開發(fā)一款直播 APP】4.1 網(wǎng)絡(luò)封裝之 Okhttp -- 基礎(chǔ)回顧
【從 0 開始開發(fā)一款直播 APP】4.2 網(wǎng)絡(luò)封裝之 OkHttp -- GET损搬,POST,前后端交互
【從 0 開始開發(fā)一款直播 APP】4.3 網(wǎng)絡(luò)封裝之 OkHttp -- 封裝 GET柜与,POST FORM巧勤,POST JSON
【從 0 開始開發(fā)一款直播 APP】4.4 網(wǎng)絡(luò)封裝之 OkHttp -- 網(wǎng)絡(luò)請求實現(xiàn)直播登錄


上一章講了 OkHttp 的封裝颅悉,現(xiàn)在來使用一下封裝吧迁匠。

網(wǎng)絡(luò)請求進行手機登錄和用戶名登錄。


先來介紹一個請求工具 postman豌鹤,Google 瀏覽器上的一個插件傍药,也有對應(yīng)的應(yīng)用程序魂仍,親測很好用擦酌,推薦給大家赊舶。

好了笼平,開始講解網(wǎng)絡(luò)請求舔痪,測試一下封裝的 Okhttp 框架锄码。
講解之前添加依賴以及相關(guān)權(quán)限

compile 'com.google.code.gson:gson:2.3.1'
compile 'com.zhy:okhttputils:2.6.2'

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

一滋捶、界面布局

里面用到了一個控件重窟,很漂亮,看到輸入框的文字會跳動對吧扭仁,就是這個控件斋枢。android.support.design.widget.TextInputLayout

<?xml version="1.0" encoding="utf-8"?>
<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:background="@mipmap/bg_dark"
    android:id="@+id/rl_login_root"
    tools:context="com.dali.admin.livestreaming.activity.LoginActivity">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="19dp"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="100dp">

        //驗證碼
        <Button
            android:id="@+id/btn_verify_code"
            android:layout_width="90dp"
            android:layout_height="35dp"
            android:layout_alignEnd="@+id/til_login"
            android:layout_alignRight="@+id/til_login"
            android:layout_below="@+id/til_login"
            android:layout_marginRight="5dp"
            android:layout_marginTop="2dp"
            android:background="@drawable/btn_login"
            android:clickable="true"
            android:minWidth="0dp"
            android:padding="4dp"
            android:text="@string/activity_login_verify_code"
            android:textSize="12sp"
            style="@style/loginButton"
            />
        <android.support.design.widget.TextInputLayout
            android:id="@+id/til_login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            >
            //用戶名
            <AutoCompleteTextView
                android:id="@+id/et_username"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:hint="@string/activity_login_username"
                android:inputType="textEmailAddress"
                android:maxLength="24"
                android:maxLines="1"
                android:singleLine="true"
                android:textColor="@drawable/tv_selector"
                android:textColorHint="@color/white"
                />
        </android.support.design.widget.TextInputLayout>

        <android.support.design.widget.TextInputLayout
            android:id="@+id/til_password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/til_login">
            //密碼
            <EditText
                android:id="@+id/et_password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@+id/et_login"
                android:ellipsize="end"
                android:hint="@string/activity_login_password"
                android:imeActionId="@+id/login"
                android:imeOptions="actionUnspecified"
                android:inputType="textPassword"
                android:maxLength="24"
                android:maxLines="1"
                android:singleLine="true"
                android:textColor="@color/white"
                android:textColorHint="@color/white"/>
        </android.support.design.widget.TextInputLayout>

        //登錄
        <Button
            android:id="@+id/btn_login"
            android:layout_alignParentEnd="true"
            android:layout_below="@+id/til_password"
            android:background="@drawable/btn_login"
            android:clickable="true"
            android:padding="0dp"
            android:text="@string/activity_login_btnlogin"
            style="@style/loginButton"/>

        //手機號登錄
        <Button
            android:id="@+id/btn_phone_login"
            android:layout_width="wrap_content"
            android:layout_below="@+id/btn_login"
            android:layout_marginTop="10dp"
            android:text="@string/activity_login_btnphone"
            android:background="?attr/selectableItemBackground"
            style="@style/loginButton"
            />

        //注冊新用戶
        <Button
            android:id="@+id/btn_register"
            android:layout_width="wrap_content"
            android:layout_alignEnd="@+id/btn_login"
            android:layout_alignRight="@+id/btn_login"
            android:layout_below="@+id/btn_login"
            android:background="?attr/selectableItemBackground"
            android:layout_marginTop="10dp"
            android:text="@string/activity_login_register"
            style="@style/loginButton"
            />

        <ProgressBar
            android:id="@+id/progressbar"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_alignTop="@+id/btn_login"
            android:layout_centerHorizontal="true"
            android:visibility="gone"/>
    </RelativeLayout>
</RelativeLayout>

二戈次、登錄界面邏輯實現(xiàn)

2.1、類的初始化

創(chuàng)建 LoginActivity 類绊寻,繼承 BaseActivity澄步,實現(xiàn)其抽象方法村缸。實例化控件武氓。

public class LoginActivity extends BaseActivity implements View.OnClickListener{
    //控件
    private ProgressBar progressBar;
    private EditText etPassword;
    private EditText etLogin;
    private Button btnLogin;
    private Button btnPhoneLogin;
    private TextInputLayout tilLogin, tilPassword;
    private Button btnRegister;
    private TextView tvVerifyCode;
    //是否是手機號登錄
    private boolean isPhoneLogin = false;
  
    @Override
    protected void setActionBar() {
    }

    @Override
    protected void setListener() {
    }

    @Override
    protected void initData() {
    }

    @Override
    protected void initView() {
        etLogin = obtainView(R.id.et_username);
        etPassword = obtainView(R.id.et_password);
        btnRegister = obtainView(R.id.btn_register);
        btnPhoneLogin = obtainView(R.id.btn_phone_login);
        btnLogin = obtainView(R.id.btn_login);
        progressBar = obtainView(R.id.progressbar);
        tilLogin = obtainView(til_login);
        tilPassword = obtainView(R.id.til_password);
        tvVerifyCode = obtainView(R.id.btn_verify_code);
        //第一次進入系統(tǒng)默認是用戶名登錄
        userNameLoginViewInit();
    }

    @Override
    protected int getLayoutId() {
        return R.layout.activity_login;
    }
  
    @Override
    public void onClick(View v) {
    }
}

2.2东羹、用戶名登錄實現(xiàn)

這里實現(xiàn)邏輯忠烛,解釋一下實現(xiàn)思路况木,而登錄請求網(wǎng)絡(luò)后面介紹火惊。

//用戶名登錄方法
public void userNameLoginViewInit() {
    //用戶名登錄控件初始化
    userLoginTrans();

    //注冊監(jiān)聽
    btnRegister.setOnClickListener(this);
    //這里只是用做切換界面屹耐,用戶名登錄情況下點擊按鈕顯示到手機號登錄,顯示獲取驗證碼按鈕
    btnPhoneLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //手機號登錄切換
            phoneLoginViewinit();
        }
    });
    //登錄按鈕監(jiān)聽
    btnLogin.setOnClickListener(this);
}
//用戶名登錄界面控件顯示
private void userLoginTrans() {
        //將手機號登錄設(shè)置為 false
        isPhoneLogin = false;
        //隱藏獲取驗證碼按鈕
        tvVerifyCode.setVisibility(View.GONE);
        AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);
        alphaAnimation.setDuration(250);
        tvVerifyCode.setAnimation(alphaAnimation);
        //設(shè)置輸入框輸入類型為 文本輸入
        etLogin.setInputType(EditorInfo.TYPE_CLASS_TEXT);
        //清空輸入框內(nèi)容
        etLogin.setText("");
        etPassword.setText("");
        //設(shè)置用戶名登錄按鈕文字為 手機號登錄
        btnPhoneLogin.setText("手機號登錄");
        //設(shè)置 TextInputLayout 文字為 用戶名和密碼
        tilLogin.setHint("用戶名");
        tilPassword.setHint("密碼");
}

2.3、手機號登錄實現(xiàn)

如上按灶,實現(xiàn)邏輯鸯旁,登錄請求網(wǎng)絡(luò)接下來介紹。

//手機號登錄方法
public void phoneLoginViewinit() {
    //用戶名登錄控件初始化
    phoneLoginTrans();
    //這里只是用做切換界面残炮,用戶名登錄情況下點擊按鈕顯示到手機號登錄势就,顯示獲取驗證碼按鈕
    btnPhoneLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //轉(zhuǎn)換為用戶名登錄界面
            userNameLoginViewInit();
        }
    });
    //登錄按鈕監(jiān)聽
    btnLogin.setOnClickListener(this);
}
//手機號登錄控件顯示
private void phoneLoginTrans() {
    //將手機號登錄設(shè)置為 true
    isPhoneLogin = true;
    //顯示獲取驗證碼按鈕
    tvVerifyCode.setVisibility(View.VISIBLE);
    AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);
    alphaAnimation.setDuration(250);
    tvVerifyCode.setAnimation(alphaAnimation);
    //設(shè)定點擊優(yōu)先級于最前(避免被EditText遮擋的情況)
    tvVerifyCode.bringToFront();
    //設(shè)置輸入框輸入類型為 手機號
    etLogin.setInputType(EditorInfo.TYPE_CLASS_PHONE);
    //清空輸入框內(nèi)容
    etLogin.setText("");
    etPassword.setText("");
    //手機號登錄按鈕文字改為 用戶名登錄
    btnPhoneLogin.setText("用戶名登錄");
    //設(shè)置 TextInputLayout 文字為 手機號和密碼
    tilLogin.setHint("手機號");
    tilPassword.setHint("密碼");
}

2.4苞冯、請求網(wǎng)絡(luò)實現(xiàn)登錄


2.4.1抱完、用戶名登錄

之前介紹的工具還沒用上呢刃泡,現(xiàn)在來請求網(wǎng)絡(luò)烘贴,看看需要那些數(shù)據(jù)桨踪,請求參數(shù)有登錄方式 action芹啥,用戶名 userName 和 密碼 password墓怀。


2.4.2傀履、為如上數(shù)據(jù)創(chuàng)建一個請求實體類钓账。

public class LoginRequest extends IRequest {
   public LoginRequest(int requestId, String userName, String password) {
      mRequestId = requestId;
      mParams.put("action", "login");
      mParams.put("userName", userName);
      mParams.put("password", password);
   }

   //getHost():返回的 API梆暮,這里在封裝 OkHttp 框架的時候有的,HOST_PUBLIC = "http://live.demo.cniao5.com/Api/";
   @Override
   public String getUrl() {
      return getHost() + "User";
   }

   @Override
   public Type getParserType() {
      return new TypeToken<Response<UserInfo>>() {
      }.getType();
   }
}

2.4.3偿荷、網(wǎng)絡(luò)請求實現(xiàn)用戶名登錄

public void usernameLogin(final String userName, final String password) {
    //檢查網(wǎng)絡(luò)狀態(tài)遭顶,需要添加網(wǎng)絡(luò)使用權(quán)限:ACCESS_NETWORK_STATE
    if (checkUserNameLogin(userName, password)) {
        // RequestComm.login 是 requestId:值是120棒旗,后臺提供
        LoginRequest req = new LoginRequest(RequestComm.login, userName, password);
        AsyncHttp.instance().postJson(req, new AsyncHttp.IHttpListener() {
            @Override//請求網(wǎng)絡(luò)之前調(diào)用
            public void onStart(int requestId) {
                //顯示環(huán)形進度條
                showOnLoading(true);
            }

            @Override
            public void onSuccess(int requestId, Response response) {
                //RequestComm.SUCCESS 狀態(tài)驗證:值是0铣揉,上面請求網(wǎng)絡(luò)有顯示
                if (response.status == RequestComm.SUCCESS) {
                    Toast.makeText(LoginActivity.this, "登錄成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(LoginActivity.this, "登錄失敗", Toast.LENGTH_SHORT).show();
                }
                //隱藏環(huán)形進度條
                showOnLoading(false);
            }

            @Override
            public void onFailure(int requestId, int httpStatus, Throwable error) {
                showOnLoading(false);//隱藏環(huán)形進度條
                Toast.makeText(LoginActivity.this, "登錄失敗", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

2.5逛拱、手機登錄實現(xiàn)

手機號登錄先來測試網(wǎng)絡(luò)數(shù)據(jù)API朽合,看看實體類需要的數(shù)據(jù)。請求參數(shù)有登錄方式 action宪彩,手機號 mobile 和 驗證碼 verifyCode尿孔。


2.5.1活合、創(chuàng)建手機登錄請求實體類

public class PhoneLoginRequest extends IRequest {
   public PhoneLoginRequest(int requestId, String mobile, String verifyCode) {
      mRequestId = requestId;
      mParams.put("action", "phoneLogin");
      mParams.put("mobile", mobile);
      mParams.put("verifyCode", verifyCode);
   }

  //getHost():返回的 API白指,這里在封裝 OkHttp 框架的時候有的侵续,HOST_PUBLIC = "http://live.demo.cniao5.com/Api/";
   @Override
   public String getUrl() {
      return getHost() + "User";
   }

   @Override
   public Type getParserType() {
      return new TypeToken<Response>() {
      }.getType();
   }
}

2.5.2状蜗、網(wǎng)絡(luò)請求實現(xiàn)手機號登錄

public void phoneLogin(final String mobile, String verifyCode) {
    //檢查網(wǎng)絡(luò)狀態(tài)鹉动,需要添加網(wǎng)絡(luò)使用權(quán)限:ACCESS_NETWORK_STATE
    if (checkPhoneLogin(mobile, verifyCode)) {//requestId = 1200,后臺提供
        PhoneLoginRequest req = new PhoneLoginRequest(1200, mobile, verifyCode);
        AsyncHttp.instance().postJson(req, new AsyncHttp.IHttpListener() {
            @Override//請求網(wǎng)絡(luò)之前調(diào)用
            public void onStart(int requestId) {
                showOnLoading(true);//顯示環(huán)形進度條
            }

            @Override
            public void onSuccess(int requestId, Response response) {
                //RequestComm.SUCCESS 狀態(tài)驗證:值是0泽示,上面請求網(wǎng)絡(luò)有顯示
                if (response.status == RequestComm.SUCCESS) {
                    Toast.makeText(LoginActivity.this, "登錄成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(LoginActivity.this, "登錄失敗", Toast.LENGTH_SHORT).show();
                }
                showOnLoading(false);//隱藏環(huán)形進度條
            }

            @Override
            public void onFailure(int requestId, int httpStatus, Throwable error) {
                showOnLoading(false);//隱藏環(huán)形進度條
                Toast.makeText(LoginActivity.this, "網(wǎng)絡(luò)異常", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

檢查用戶名登錄捎泻、手機登錄、環(huán)形進度條顯示或隱藏代碼

//監(jiān)測用戶名登錄
public boolean checkUserNameLogin(String userName, String password) {
    if (OtherUtils.isUsernameVaild(userName)) {
        if (OtherUtils.isPasswordValid(password)) {
            if (OtherUtils.isNetworkAvailable(this)) {
                return true;
            } else {
                ToastUtils.showShort(this, "當前無網(wǎng)絡(luò)連接");
            }
        } else {
            ToastUtils.showShort(this, "密碼過短");
        }
    } else {
        ToastUtils.showShort(this, "用戶名不符合規(guī)范");
    }
    return false;
}
//監(jiān)測手機號登錄
public boolean checkPhoneLogin(String phone, String verifyCode) {
        if (OtherUtils.isPhoneNumValid(phone)) {
            if (OtherUtils.isVerifyCodeValid(verifyCode)) {
                if (OtherUtils.isNetworkAvailable(this)) {
                    return true;
                } else {
                    ToastUtils.showShort(this, "當前無網(wǎng)絡(luò)連接");
                }
            } else {
                ToastUtils.showShort(this, "驗證碼錯誤");
            }
        } else {
            ToastUtils.showShort(this, "手機格式錯誤");
        }
        return false;
}
//進度條顯示與隱藏
public void showOnLoading(boolean active) {
        if (active) {
            //顯示進度條
            progressBar.setVisibility(View.VISIBLE);
            //顯示登錄按鈕
            btnLogin.setVisibility(View.INVISIBLE);
            //輸入框設(shè)置不可用
            etLogin.setEnabled(false);
            etPassword.setEnabled(false);
            //手機號按鈕和按鈕設(shè)置為不可點擊
            btnPhoneLogin.setClickable(false);
            btnRegister.setClickable(false);
 btnRegister.setTextColor(getResources().getColor(R.color.colorTransparentGray));          btnPhoneLogin.setTextColor(getResources().getColor(R.color.colorTransparentGray));
            
        } else {
            //隱藏進度條
            progressBar.setVisibility(View.GONE);
            //隱藏登錄按鈕
            btnLogin.setVisibility(View.VISIBLE);
            //輸入框設(shè)置可用
            etLogin.setEnabled(true);
            etPassword.setEnabled(true);
            //手機號按鈕和按鈕設(shè)置為可點擊
            btnPhoneLogin.setClickable(true);
            btnRegister.setClickable(true);
            btnRegister.setTextColor(getResources().getColor(R.color.white));
            btnPhoneLogin.setTextColor(getResources().getColor(R.color.white));
        }
}

2.6闯狱、手機號登錄和用戶名登錄切換

@Override
public void onClick(View v) {
    if (isPhoneLogin){
        phoneLogin(etLogin.getText().toString(), etPassword.getText().toString());
    }else {
        usernameLogin(etLogin.getText().toString(), etPassword.getText().toString());
    }

}

三哄孤、完整的代碼實現(xiàn)

public class LoginActivity extends BaseActivity implements View.OnClickListener {
    private ProgressBar progressBar;
    private EditText etPassword;
    private EditText etLogin;
    private Button btnLogin;
    private Button btnPhoneLogin;
    private TextInputLayout tilLogin, tilPassword;
    private Button btnRegister;
    private TextView tvVerifyCode;
    private boolean isPhoneLogin = false;

    @Override
    protected void setActionBar() {
    }

    @Override
    protected void setListener() {
    }

    @Override
    protected void initData() {
    }

    @Override
    protected void initView() {
        etLogin = obtainView(R.id.et_username);
        etPassword = obtainView(R.id.et_password);
        btnRegister = obtainView(R.id.btn_register);
        btnPhoneLogin = obtainView(R.id.btn_phone_login);
        btnLogin = obtainView(R.id.btn_login);
        progressBar = obtainView(R.id.progressbar);
        tilLogin = obtainView(til_login);
        tilPassword = obtainView(R.id.til_password);
        tvVerifyCode = obtainView(R.id.btn_verify_code);
        userNameLoginViewInit();
    }

    @Override
    protected int getLayoutId() {
        return R.layout.activity_login;
    }

    /**
     * 用戶名密碼登錄界面
     */
    public void userNameLoginViewInit() {
        userLoginTrans();
        btnRegister.setOnClickListener(this);
        btnPhoneLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //手機號登錄
                phoneLoginViewinit();
            }
        });
        //用戶名登錄
        btnLogin.setOnClickListener(this);

    }

    public void phoneLoginViewinit() {
        phoneLoginTrans();
                //轉(zhuǎn)換為用戶名登錄界面
                userNameLoginViewInit();
            }
        });
        btnLogin.setOnClickListener(this);
    }

    private void phoneLoginTrans() {
        isPhoneLogin = true;
        tvVerifyCode.setVisibility(View.VISIBLE);
        AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);
        alphaAnimation.setDuration(250);
        tvVerifyCode.setAnimation(alphaAnimation);
        tvVerifyCode.bringToFront();
        etLogin.setInputType(EditorInfo.TYPE_CLASS_PHONE);
        etLogin.setText("");
        etPassword.setText("");
        btnPhoneLogin.setText("用戶名登錄");
        tilLogin.setHint("手機號");
        tilPassword.setHint("密碼");
    }

    private void userLoginTrans() {
        isPhoneLogin = false;
        tvVerifyCode.setVisibility(View.GONE);
        AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);
        alphaAnimation.setDuration(250);
        tvVerifyCode.setAnimation(alphaAnimation);
        etLogin.setInputType(EditorInfo.TYPE_CLASS_TEXT);
        etLogin.setText("");
        etPassword.setText("");
        btnPhoneLogin.setText("手機號登錄");
        tilLogin.setHint("用戶名");
        tilPassword.setHint("密碼");
    }

    /**
     * 手機登錄和用戶名登錄界面顯示或隱藏
     */
    public void showOnLoading(boolean active) {
        if (active) {
            progressBar.setVisibility(View.VISIBLE);
            btnLogin.setVisibility(View.INVISIBLE);
            etLogin.setEnabled(false);
            etPassword.setEnabled(false);
            btnPhoneLogin.setClickable(false);
 btnRegister.setTextColor(getResources().getColor(R.color.colorTransparentGray));         btnPhoneLogin.setTextColor(getResources().getColor(R.color.colorTransparentGray));
            btnRegister.setClickable(false);
        } else {
            progressBar.setVisibility(View.GONE);
            btnLogin.setVisibility(View.VISIBLE);
            etLogin.setEnabled(true);
            etPassword.setEnabled(true);
            btnPhoneLogin.setClickable(true);
            btnRegister.setClickable(true);
            btnRegister.setTextColor(getResources().getColor(R.color.white));
            btnPhoneLogin.setTextColor(getResources().getColor(R.color.white));
        }
    }

    public void phoneLogin(final String mobile, String verifyCode) {
        if (checkPhoneLogin(mobile, verifyCode)) {
            PhoneLoginRequest req = new PhoneLoginRequest(1200, mobile, verifyCode);
            AsyncHttp.instance().postJson(req, new AsyncHttp.IHttpListener() {
                @Override
                public void onStart(int requestId) {
                    showOnLoading(true);
                }

                @Override
                public void onSuccess(int requestId, Response response) {
                    if (response.status == RequestComm.SUCCESS) {
                        Toast.makeText(LoginActivity.this, "登錄成功", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(LoginActivity.this, "登錄失敗", Toast.LENGTH_SHORT).show();
                    }
                    showOnLoading(false);
                }
                @Override
                public void onFailure(int requestId, int httpStatus, Throwable error) {
                    showOnLoading(false);
                    Toast.makeText(LoginActivity.this, "網(wǎng)絡(luò)異常", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

    public boolean checkPhoneLogin(String phone, String verifyCode) {
        if (OtherUtils.isPhoneNumValid(phone)) {
            if (OtherUtils.isVerifyCodeValid(verifyCode)) {
                if (OtherUtils.isNetworkAvailable(this)) {
                    return true;
                } else {
                    ToastUtils.showShort(this, "當前無網(wǎng)絡(luò)連接");
                }
            } else {
                ToastUtils.showShort(this, "驗證碼錯誤");
            }
        } else {
            ToastUtils.showShort(this, "手機格式錯誤");
        }
        return false;
    }

    public void usernameLogin(final String userName, final String password) {
        if (checkUserNameLogin(userName, password)) {
            LoginRequest req = new LoginRequest(RequestComm.login, userName, password);
            AsyncHttp.instance().postJson(req, new AsyncHttp.IHttpListener() {
                @Override
                public void onStart(int requestId) {
                    showOnLoading(true);
                }

                @Override
                public void onSuccess(int requestId, Response response) {
                    if (response.status == RequestComm.SUCCESS) {
                        Toast.makeText(LoginActivity.this, "登錄成功", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(LoginActivity.this, "登錄失敗", Toast.LENGTH_SHORT).show();
                    }
                    showOnLoading(false);
                }

                @Override
                public void onFailure(int requestId, int httpStatus, Throwable error) {
                    showOnLoading(false);
                    Toast.makeText(LoginActivity.this, "登錄失敗", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

    public boolean checkUserNameLogin(String userName, String password) {
        if (OtherUtils.isUsernameVaild(userName)) {
            if (OtherUtils.isPasswordValid(password)) {
                if (OtherUtils.isNetworkAvailable(this)) {
                    return true;
                } else {
                    ToastUtils.showShort(this, "當前無網(wǎng)絡(luò)連接");
                }
            } else {
                ToastUtils.showShort(this, "密碼過短");
            }
        } else {
            ToastUtils.showShort(this, "用戶名不符合規(guī)范");
        }
        return false;
    }

    @Override
    public void onClick(View v) {
        if (isPhoneLogin){
            phoneLogin(etLogin.getText().toString(), etPassword.getText().toString());
        }else {
            usernameLogin(etLogin.getText().toString(), etPassword.getText().toString());
        }
    }
}

140套Android優(yōu)秀開源項目源碼,領(lǐng)取地址:http://mp.weixin.qq.com/s/afPGHqfdiApALZqHsXbw-A

寫得不到位的地方還望大家指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昏翰,一起剝皮案震驚了整個濱河市刘急,隨后出現(xiàn)的幾起案子叔汁,更是在濱河造成了極大的恐慌据块,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件像屋,死亡現(xiàn)場離奇詭異己莺,居然都是意外死亡,警方通過查閱死者的電腦和手機阵子,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門款筑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奈梳,“玉大人攘须,你說我怎么就攤上這事殴泰。” “怎么了捞魁?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵谱俭,是天一觀的道長昆著。 經(jīng)常有香客問我凑懂,道長梧宫,這世上最難降的妖魔是什么塘匣? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任馆铁,我火速辦了婚禮,結(jié)果婚禮上历谍,老公的妹妹穿的比我還像新娘望侈。我一直安慰自己,他們只是感情好侥猬,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布退唠。 她就那樣靜靜地躺著瞧预,像睡著了一般仅政。 火紅的嫁衣襯著肌膚如雪圆丹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音檀咙,去河邊找鬼璃诀。 笑死劣欢,一個胖子當著我的面吹牛凿将,可吹牛的內(nèi)容都是我干的价脾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼妹孙,長吁一口氣:“原來是場噩夢啊……” “哼获枝!你這毒婦竟也來了省店?” 一聲冷哼從身側(cè)響起懦傍,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤粗俱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后娱俺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荠卷,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡油宜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年慎冤,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚁堤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片但狭。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡立磁,死狀恐怖唱歧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情几于,我是刑警寧澤孩革,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布膝蜈,位于F島的核電站饱搏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏备绽。R本人自食惡果不足惜肺素,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一倍靡、第九天 我趴在偏房一處隱蔽的房頂上張望塌西。 院中可真熱鬧筝尾,春花似錦筹淫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薛匪。三九已至,卻和暖如春脓鹃,著一層夾襖步出監(jiān)牢的瞬間逸尖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留娇跟,地道東北人岩齿。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像苞俘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吃谣,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容