1、简介
asynctask部分,主要使用了模版方法,对asynctask类的封装,主要是简化了耗时操作的写法,原本的耗时操作需要在线程中执行,然后如果在线程中需要更新UI的话,得用Handler提交给UI线程执行。下面是未使用的代码写法:
private Handler handler = new Handler();
......
new Thread() {
@Override
public void run() {
String resultStr = null;
try {
resultStr = doHttpOperation();//Http耗时操作获取资源结果
} catch (Exception e) {
}
//耗时操作完成后更新UI,给TextView设置结果
handler.post(new Runnable(){
@Override
public void run(){
textView.setText(resultStr);//更新UI,需要在UI线程中操作
}
};
);}
}.start();
2、
asynctask部分的使用详解
(1)首先,定义一个类,继承AbstractTask。如下面的代码:
public class GetUserTask extends AbstractTask<String> {
public GetUserTask(Context context,boolean isShow) {
super(context,isShow);
}
@Override
protected Result<String> doHttpRequest(Object... objects) {
String resultStr = doHttpOperation();//Http耗时请求
Result<String> result = null;
if(TextUtils.isEmpty(resultStr)){
result = new Result(false,"请求异常");
}else{
result = new Result(false,"",resultStr);
}
return result;
}
}
(2)然后就可以在Activity中或者别的地方使用了。如下更新TextView操作:
//true表示请求时会有提示,如果想后台默默执行不想提醒用户,可以设置成false
GetUserTask task = new GetUserTask(this,true);
//设置成功回调,更新TextView就可以在这里操作
task.setAsyncTaskSuccessCallback(new AsyncTaskSuccessCallback<String>() {
@Override
public void successCallback(Result<String> result) {
String resultStr = result.getValue();
textView.setText(resultStr);
}
}
//设置失败回调,如果不想捕捉可以忽略不设置
task.AsyncTaskSuccessCallback(new AsyncTaskSuccessCallback<String>() {
@Override
public void successCallback(Result<String> result) {
}
}
//执行,可以传入参数
task.execute(new Object[] { accountId});
3、结尾
上面看上去,好像使用了框架代码更多了,其实不是,使用框架之后,可以使耗时操作(例如Http操作)和UI更新操作分离。使代码更加简洁可维护。第二,如果使用Thread和Handler来实现,还需要自己实现ProgressDialog,用来提醒用户,类似于:正在加载中...这样的对话框,而这一点框架都帮你完成了。当然方便向左,灵活向右,框架可以满足大部分逻辑操作,如果需要更灵活,例如,在Http加载中,提示用户加载进度百分比,那么框架就不能满足了,这时候只能自己用Thread和Handler去实现。不过这方面需求不多,当然框架还在发展,有待支持更灵活,还在等什么,期待你的加入。
来源:oschina
链接:https://my.oschina.net/u/266567/blog/151980