我常用的方式是new AsyncTask(), 可能比較方便吧,弊端:就是一旦請求,沒有焦點,只能等待黑圈轉完;new Thread() 好處是好控制,但是用多了佔內存;
前幾天跟同事討論了下,翻看了下源碼,方案來了!
我們要實現的就是我不想請求了,按下back鍵,請求終止,然後焦點出現:
來段登錄請求的源碼:
package com.bt.property.asynctask;
/**
* 異步任務-登錄
* @author 24K
* @created 2013年11月20日15:02:17
*/
public class LoginAsyncTask extends AsyncTask<String, Void, User> {
protected static final String TAG = LoginAsyncTask.class.getSimpleName();
private ProgressDialog dialog;
private int result;
private Context activity;
private LoginService loginService = new LoginService();
private User userInfo;
private SharedPreferencesUtil sp;
private boolean isRemember;//是否記住密碼
public LoginAsyncTask(Context mContext, boolean isRemember) {
super();
this.activity = mContext;
this.isRemember = isRemember;
sp = new SharedPreferencesUtil(activity);//pref.
// dialog = new ProgressDialog(activity);
// dialog.setCancelable(true);
// dialog.setCanceledOnTouchOutside(true);
// dialog.setIndeterminate(false); //設置進度條是否爲不明確
// dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); //圓形
}
@Override
protected void onPreExecute() {
super.onPreExecute();
//此處見真章!!! 呵呵~~
dialog = ProgressDialog.show(activity, "", "登錄中,請稍後...",false, true,new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
if (LoginAsyncTask.this.getStatus() != AsyncTask.Status.FINISHED) {
cancel(true);//中斷task操作
}
}
}); //模態,防止任意touch屏幕即中斷task操作
dialog.setCanceledOnTouchOutside(false);
}
@Override
protected User doInBackground(String... params) {
String username = params[0];
String password = params[1];
//判斷登錄成功之後是否記住用戶信息
if(isRemember && !TextUtils.isEmpty(username) && !TextUtils.isEmpty(password)) {
sp.putValue(ConstantUtil.USER_NAME, username);
sp.putValue(ConstantUtil.USER_PASS, password);
sp.putValue(ConstantUtil.IS_REMEMBER, true);
} else {
sp.putValue(ConstantUtil.USER_NAME, "");
sp.putValue(ConstantUtil.USER_PASS, "");
sp.putValue(ConstantUtil.IS_REMEMBER, false);
}
try {
userInfo = loginService.getLogin(activity, username, password);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return userInfo;
}
protected void onPostExecute(User userInfo) {
if(dialog.isShowing()) {
dialog.dismiss();
}
if(userInfo != null) {
result = StaticData.loginStatus;
if(result == ConstantUtil.RESULT_CODE_SUCCEED){//登錄成功
promptShow("登錄成功");
activity.startActivity(new Intent(activity, PropertyMainAct.class));
((Activity) activity).overridePendingTransition(R.anim.slide_right_in, R.anim.slide_left_out);
} else if(result == ConstantUtil.RESULT_CODE_FAIL){
promptShow("用戶名或密碼錯誤...");
activity.startActivity(new Intent(activity, PropertyMainAct.class));
} else if(result == ConstantUtil.NO_PERMISSION){
promptShow("無權限...");
} else if(result == ConstantUtil.NETWORK_ERROR){
promptShow("連接失敗...");
} else if(result == ConstantUtil.RESULT_FAILURE){
promptShow("連接超時...");
}
}else {
promptShow("登錄失敗");
// sp.putValue(ConstantUtil.IS_REMEMBER, false);
}
}
private void promptShow(String str){
Toast.makeText(activity, str, Toast.LENGTH_SHORT).show();
}
}
注:源碼真的很重要,因爲只有源碼才能解釋所有的疑惑。