AsyncTask的实用-中断请求实现
来源:互联网 发布:数据库安全审计 编辑:程序博客网 时间:2024/06/05 04:22
平时的app网络操作一般有几种方式: new Thread() + handler ; new AsyncTask().......
我常用的方式是new AsyncTask(), 可能比较方便吧,弊端:就是一旦请求,没有焦点,只能等待黑圈转完;new Thread() 好处是好控制,但是用多了占内存;
前几天跟同事讨论了下,翻看了下源码,方案来了!
我们要实现的就是我不想请求了,按下back键,请求终止,然后焦点出现:
来段登录请求的源码:
注:源码真的很重要,因为只有源码才能解释所有的疑惑。
我常用的方式是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
- AsyncTask的实用-中断请求实现
- Activity的AsyncTask请求
- android AsyncTask 请求与实现
- 通过AsyncTask实现网络请求的方式,get和post
- 通过AsyncTask实现网络请求的方式,get和post
- 中断之中断请求队列的初始化
- 【中断异常】中断请求队列的初始化
- AsyncTask的实现原理
- AsyncTask实现的原理
- AsyncTask的实现原理
- AsyncTask的实现机制
- AsyncTask的实现
- AsyncTask的实现原理
- 内核下的中断请求
- AsyncTask异步任务请求的流程
- Android AsyncTask的实现基本原理
- 二、 AsyncTask的实现基本原理
- 使用AsyncTask 实现网络请求及PullToRefreshListView下拉刷新
- 获知自己所在的DNS服务器(windows下)
- GridView行,指向时变色
- 享元模式
- 模拟频率、数字频率、模拟角频率
- 单链表基本操作
- AsyncTask的实用-中断请求实现
- ios去掉字符串中的html标签的方法
- Ext ComboBox+store数据
- 解决eclipse导入web工程不能识别为web工程的方法
- USACO 3.1 Stamps (stamps)
- Ubuntu下为Firefox安装Adobe Flash Player
- Linux top 命令详解
- 顺序表基本操作-C语言
- 能被7,11,13整除的数的特征 joj 2586