天天看點

對AsyncTask進行封裝,簡化繁瑣的異步操作

對于android的異步操作,往往有二種方法給予我們選擇。

     一:thread+handler

     二:  asynctask

     對于二者的相同與異同點,這裡并不去進行比較。這裡提供一種簡化異步操作的方法,供大家參考學習。   

     代碼參考自andengine,不過我對它做了一定的修改,讓它更适合自己目前項目的開發,感謝open source 能夠讓我們去學習和閱讀那麼多優秀的代碼。

     廢話不多說,代碼如下:

     callearliest<t>:

java代碼  

對AsyncTask進行封裝,簡化繁瑣的異步操作

/** 

 *  

 * 回調接口,回調方法運作于主線程 

 * @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>:

    /**

對AsyncTask進行封裝,簡化繁瑣的異步操作

 * 回調接口,回調方法運作于異步線程  

 * @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>:

   /**

對AsyncTask進行封裝,簡化繁瑣的異步操作

 * 回調接口,回調方法運作于主線程  

 * @classname: callback     

 * @version 1.0 2012-1-16 下午5:58:16     

public interface callback<t> {  

    public void oncallback(final t pcallbackvalue);  

   iprogresslistener:

對AsyncTask進行封裝,簡化繁瑣的異步操作

* 觀察者  

* @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>:

對AsyncTask進行封裝,簡化繁瑣的異步操作

 * 被觀察者 

 * @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:

對AsyncTask進行封裝,簡化繁瑣的異步操作

 * 異步操作工具類 

 * @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:

對AsyncTask進行封裝,簡化繁瑣的異步操作

 * 公用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:

對AsyncTask進行封裝,簡化繁瑣的異步操作

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) {  

                });  

    效果圖:

對AsyncTask進行封裝,簡化繁瑣的異步操作

   示例可參見附件.

simpleasynctask.zip (58.5 kb)

繼續閱讀