天天看点

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

继续阅读