AsyncTask的實用-中斷請求實現

平時的app網絡操作一般有幾種方式: new Thread() + handler ; new AsyncTask().......
我常用的方式是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();
	}
	
}

注:源碼真的很重要,因爲只有源碼才能解釋所有的疑惑
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章