AsyncTask的实用-中断请求实现

来源:互联网 发布:数据库安全审计 编辑:程序博客网 时间:2024/06/05 04:22
平时的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); //圆形}@Overrideprotected void onPreExecute() {super.onPreExecute();
//此处见真章!!! 呵呵~~dialog = ProgressDialog.show(activity, "", "登录中,请稍后...",false, true,new OnCancelListener() {@Overridepublic void onCancel(DialogInterface dialog) {if (LoginAsyncTask.this.getStatus() != AsyncTask.Status.FINISHED) {cancel(true);//中断task操作}}}); //模态,防止任意touch屏幕即中断task操作dialog.setCanceledOnTouchOutside(false);}@Overrideprotected 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();}}

注:源码真的很重要,因为只有源码才能解释所有的疑惑
0 0
原创粉丝点击