AsyncTask的实用-中断请求实现

本文介绍了如何在Android中使用AsyncTask进行网络请求,并通过在onPreExecute()中设置ProgressDialog,监听取消事件来中断任务。当按下back键时,调用cancel(true)方法中断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();
	}
	
}

注:源码真的很重要,因为只有源码才能解释所有的疑惑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值