对于android的异步操作,往往有二种方法给予我们选择。
一:thread+handler
二: asynctask
对于二者的相同与异同点,这里并不去进行比较。这里提供一种简化异步操作的方法,供大家参考学习。
代码参考自andengine,不过我对它做了一定的修改,让它更适合自己目前项目的开发,感谢open source 能够让我们去学习和阅读那么多优秀的代码。
废话不多说,代码如下:
callearliest<t>:
java代码
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5ichR3cf52bjl2LcNXZnFWbp9CXt92YuUWelRXauUXasNXa3VGbvw1LcpDc0RHaiojIsJye.png)
/**
*
* 回调接口,回调方法运行于主线程
* @classname: callearliest
* @author 姜涛
* @version 1.0 2012-1-16 下午11:23:41
* @param <t>
*/
public interface callearliest<t> {
public void oncallearliest() throws exception;
}
callable<t>:
/**
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5ichR3cf52bjl2LcNXZnFWbp9CXt92YuUWelRXauUXasNXa3VGbvw1LcpDc0RHaiojIsJye.png)
* 回调接口,回调方法运行于异步线程
* @classname: callable
* @author 姜涛
* @version 1.0 2012-1-16 下午5:56:42
* @param <t>
public interface callable<t> {
public t call() throws exception;
callback<t>:
/**
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5ichR3cf52bjl2LcNXZnFWbp9CXt92YuUWelRXauUXasNXa3VGbvw1LcpDc0RHaiojIsJye.png)
* 回调接口,回调方法运行于主线程
* @classname: callback
* @version 1.0 2012-1-16 下午5:58:16
public interface callback<t> {
public void oncallback(final t pcallbackvalue);
iprogresslistener:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5ichR3cf52bjl2LcNXZnFWbp9CXt92YuUWelRXauUXasNXa3VGbvw1LcpDc0RHaiojIsJye.png)
* 观察者
* @classname: iprogresslistener
* @author 姜涛
* @version 1.0 2012-1-16 下午11:08:40
*/
ublic interface iprogresslistener {
* 进度发生改变的时候调用
* @param pprogress
public void onprogresschanged(final int pprogress);
progresscallable<t>:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5ichR3cf52bjl2LcNXZnFWbp9CXt92YuUWelRXauUXasNXa3VGbvw1LcpDc0RHaiojIsJye.png)
* 被观察者
* @classname: progresscallable
* @version 1.0 2012-1-16 下午11:08:52
public interface progresscallable<t> {
/**
* 注册观察者对象
* @param pprogresslistener
* @return
* @throws exception
*/
public t call(final iprogresslistener pprogresslistener) throws exception;
asynctaskutils:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5ichR3cf52bjl2LcNXZnFWbp9CXt92YuUWelRXauUXasNXa3VGbvw1LcpDc0RHaiojIsJye.png)
* 异步操作工具类
* @classname: activityutils
* @version 1.0 2012-1-16 下午11:02:26
public class asynctaskutils {
* 封装的asynctask方法,此方法没有进度框.
*
* @param pcallearliest
* 运行于主线程,最先执行此方法.
* @param mcallable
* 运行于异步线程,第二执行此方法.
* @param mcallback
* 运行于主线程,最后执行此方法.
public static <t> void doasync(final callearliest<t> pcallearliest,
final callable<t> pcallable, final callback<t> pcallback) {
new asynctask<void, void, t>() {
/**
* 首先运行此方法,运行于主线程
*/
@override
protected void onpreexecute() {
super.onpreexecute();
try {
pcallearliest.oncallearliest();
} catch (exception e) {
log.e("error", e.tostring());
}
}
* 第二步执行这个方法,这个方法运行在异步线程中
protected t doinbackground(void... params) {
return pcallable.call();
return null;
* 第三步执行这个方法,运行于主线程
protected void onpostexecute(t result) {
pcallback.oncallback(result);
}.execute((void[]) null);
}
* 封装的asynctask方法,此方法拥有进度对话框,并支持定义样式.
* @param pcontext
* 上下文
* @param styleid
* 对话框样式
* progressdialog.style_horizontal|progressdialog.style_spinner
* @param ptitle
* 标题
* @param pmessage
* 内容
* @param progresscallable
* 运行于异步线程,用于传递对话框进度.
* @param pcallback
public static <t> void doprogressasync(final context pcontext,
final int styleid, final string ptitle, final string pmessage,
final callearliest<t> pcallearliest,
final progresscallable<t> progresscallable,
final callback<t> pcallback) {
private progressdialog mprogressdialog;
mprogressdialog = new progressdialog(pcontext);
mprogressdialog.setprogressstyle(styleid);
mprogressdialog.settitle(ptitle);
mprogressdialog.setmessage(pmessage);
mprogressdialog.setindeterminate(false);
mprogressdialog.show();
return progresscallable.call(new iprogresslistener() {
@override
public void onprogresschanged(int pprogress) {
// todo auto-generated method stub
onprogressupdate(pprogress);
}
});
* 更新进度框
protected void onprogressupdate(final integer... values) {
mprogressdialog.setprogress(values[0]);
};
if (mprogressdialog != null)
mprogressdialog.dismiss();
* 标题,资源id
* 内容,资源id
final int styleid, final int ptitleresid, final int pmessageresid,
asynctaskutils.doprogressasync(pcontext, styleid,
pcontext.getstring(ptitleresid),
pcontext.getstring(pmessageresid), pcallearliest,
progresscallable, pcallback);
baseactivity:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5ichR3cf52bjl2LcNXZnFWbp9CXt92YuUWelRXauUXasNXa3VGbvw1LcpDc0RHaiojIsJye.png)
* 公用activity,用于存放与业务无关的公用方法
* @classname: baseactivity
* @version 1.0 2011-12-11 下午7:03:18
public abstract class baseactivity extends activity {
* @param pcallearliest 运行于主线程,最先执行此方法.
* @param mcallable 运行于异步线程,第二执行此方法.
* @param mcallback 运行于主线程,最后执行此方法.
public <t> void doasync(final callearliest<t> pcallearliest,
final callable<t> mcallable, final callback<t> mcallback) {
asynctaskutils.doasync(pcallearliest, mcallable, mcallback);
* @param pcontext 上下文
* @param styleid 对话框样式 progressdialog.style_horizontal|progressdialog.style_spinner
* @param ptitle 标题
* @param pmessage 内容
* @param pcallearliest 运行于主线程,最先执行此方法.
* @param progresscallable 运行于异步线程,用于传递对话框进度.
* @param pcallback 运行于主线程,最后执行此方法.
public <t> void doprogressasync(final context pcontext, final int styleid,
final string ptitleresid, final string pmessageresid,
final callearliest<t> pcallearliest, final progresscallable<t> pcallable,
asynctaskutils.doprogressasync(pcontext, styleid, ptitleresid,
pmessageresid, pcallearliest, pcallable, pcallback);
* @param ptitle 标题,资源id
* @param pmessage 内容,资源id
final int ptitleresid, final int pmessageresid,
simpleasynctaskactivity:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5ichR3cf52bjl2LcNXZnFWbp9CXt92YuUWelRXauUXasNXa3VGbvw1LcpDc0RHaiojIsJye.png)
public class simpleasynctaskactivity extends baseactivity {
/** called when the activity is first created. */
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
this.doprogressasync(this, progressdialog.style_horizontal,
r.string.app_name, r.string.app_name, new callearliest<void>() {
@override
public void oncallearliest() throws exception {
// todo auto-generated method stub
}
}, new progresscallable<void>() {
public void call(iprogresslistener pprogresslistener)
throws exception {
for (int i = 0; i < 100; i++) {
thread.sleep(200);
pprogresslistener.onprogresschanged(i);
return null;
}, new callback<void>() {
public void oncallback(void pcallbackvalue) {
});
效果图:
示例可参见附件.
simpleasynctask.zip (58.5 kb)