從Git上搞到了一份13年的開源商業級項目源碼,經過研究發現裏面的代碼可讀性極高,而且編寫規範、用類典雅、邏輯清晰、註釋充分,是個可以用來參考學習的好項目。
因此貼出這段驗證登錄信息並登陸的代碼,Review一下:
private EditText etAccount;// 帳號
private EditText etPassword;//密碼
private CheckBox cbSavedpw;//是否保存密碼
//...................中間省略N行.........
/**
* 執行登錄操作
*/
private void doLongin() {
name = etAccount.getText().toString().trim();
if (name.equals(userFormat)) {
name = username;
}
if (!MatchUtil.isLicitAccount(name)) {
if ("".equals(name)) {
Toast.makeText(this, R.string.null_account, 0).show();
} else if (name.length() < 3) {
Toast.makeText(this, R.string.short_account, 0).show();
} else {
Toast.makeText(this, R.string.error_account, 0).show();
}
return;
}
/*
上面這段是登錄按鈕的執行邏輯,使用了getText().toString().trim()方法獲取了一個String字符串,
並且trim()方法自動去除了輸入信息兩邊的空白內容
接下來把登錄信息放入if{}邏輯中進行比對,檢測了用戶名過短或爲空值等等的問題
*/
// 驗證密碼
final String loginPasWord = etPassword.getText().toString().trim();
if (!MatchUtil.isLicitPassword(loginPasWord)) {
if ("".equals(loginPasWord)) {
Toast.makeText(this, R.string.null_password, 0).show();
} else if (loginPasWord.length() < 6) {
Toast.makeText(this, R.string.short_password, 0).show();
} else {
Toast.makeText(this, R.string.error_password, 0).show();
}
return;
}
//同上一段,這次是驗證密碼
HttpDatas datas = new HttpDatas(Constant.USERAPI);
datas.putParam("method", "login");
datas.putParam("username", name);
datas.putParam("pwd",Md5Util.md5Diagest(loginPasWord, 16));
NetUtils.sendRequest(datas, LoginActivity.this, getString(R.string.login_now), new TaskCallBack() {
//把賬號密碼封裝到HttpDatas中,此處使用了經典的Md5加密方法,把密碼字段加密了
@Override
public int excueHttpResponse(String strResponds) {
System.out.println(strResponds);
int code = 0;
JSONObject jsonObject = JSONUtil.instaceJsonObject(strResponds);
if (jsonObject != null) {
try {
code = jsonObject.getInt("code");
} catch (JSONException e1) {
e1.printStackTrace();
}
}
if (code == 2000) {
user = JSONUtil.jsonObject2Bean(jsonObject, UserInfo.class);
if (cbSavedpw.isChecked()) {
SharedPreferences sp = LoginActivity.getOrSharedPrefences(LoginActivity.this);
Editor editor = sp.edit();
editor.putBoolean(Constant.ISSAVEPW, true);
editor.putString(Constant.USERNAME, name);
editor.putString(Constant.PASSWORD, AESUtil.hexEncrypt(loginPasWord, Constant.ENCODEPASSWORD));
editor.commit();
editor.clear();
}
return Constant.STATAS_OK;
}
return code;
}
/*發送Json請求驗證賬號密碼正確性,中間有一段使用了Editor把賬號信息添加進了SharedPreference緩存裏,
注意這裏十分嚴謹的用到了AES加密算法,具體方法:<span style="color:#FF0000;">AESUtil.hexEncrypt</span>(參數)*/
@Override
public void beforeTask() {
}
@Override
public void afterTask(int result) {
System.out.println(result);
switch (result) {
case Constant.STATAS_OK:
Toast.makeText(getApplicationContext(), LoginActivity.this.getString(R.string.login_success), 0).show();
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.putExtra("User", user);
startActivity(intent);
break;
// case 5000:
// Toast.makeText(getApplicationContext(),
// getString(R.string.error_pw_or_user), 0).show();
// break;
case 4004:
Toast.makeText(getApplicationContext(), getString(R.string.error_pw_or_user), 0).show();
break;
default:
showResulttoast(result, LoginActivity.this);
break;
}
}
<pre name="code" class="java"> });
/*
Task 完成時接收調用方提供的狀態信息並以異步方式執行的延續任務。
所以afterTask指的就是接下來的新任務,意思就是該切換頁面咯
作者先Syso了一下result,然後以result結果來建立switch/case邏輯,
我們看到,只有當全局變量是Constant.STATAS_OK時,先彈出登陸成功的Toast,然後立刻運行了轉換到新頁面的邏輯,在這裏是轉換到MainActivity;
同時我們還要注意,他在開始執行這個intent之前,用putExtra方法攜帶了一個數據User到下個界面,顯然下個頁面肯定要重新確認一下這個User值知否完備,
來確保整個登錄程序的健壯性
*/
}
接下來是一段MainAcitivty文件的開頭部分,我們通過這段代碼來驗證剛纔的分析是否正確
private UserInfo user;
public UserInfo getUser() {
return user;
}
public Handler handler = new Handler();
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.activity_main);
Intent intent = getIntent();
Serializable serializable = intent.getSerializableExtra("User");
if (serializable != null) {
user = (UserInfo) serializable;
OrongApplication.user = user;
}
initView();
/*
果然出現了一個if邏輯,他用serializable序列化器驗證了user,接下來才運行initView()方法,
也就是說如果if語句通不過,整個程序就會報錯,多麼神奇的排列順序
*/
分析完畢~