平时的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); //圆形
}
@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();
}
}
注:源码真的很重要,因为只有源码才能解释所有的疑惑。