對于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)