Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 406|回复: 0

开发交流:对Android中的AsyncTask进行函数化的封装,简洁调用

[复制链接]

该用户从未签到

发表于 2011-10-24 10:21:08 | 显示全部楼层 |阅读模式
为了使UI在数据获取时不僵死,数据获取需要在新开Worker线程中进行,然后将返回结果在UI线程中进行读取并渲染页面。面对这种异步处理,到底如何写才简洁,先后面临过三种实现方式。
首先是最原始的java方式,new 一个Thread出来,将处理Runnable进去执行,执行完之后通过handler post到ui线程去更新界面。然后发现1.5后有了AsyncTask,非常好用,以后的项目中全部改成衍生出一个AsyncTask的子类,类中自然定义了运行前方法、运行中方法和运行后在ui中运行的方法。目前我做的项目中对AsyncTask做了封装,把它从原本的子类编写的过程,改成了函数调用方式,这就是目前正使用的第三种方法。


一个Android应用中,Activity通常可以建立以上层次关系。然后,在BaseActivity中对AsyncTask进行了封装,形成doAsync方法。方法体内创建一个新的AsyncTask并执行,由于AsyncTask是泛型参数,doAsync方法中传入的接口的参数也对应使用了泛型。至此,一个典型的异步调用的案例如下:
this.doAsync(new Callable<String>() {

            // 希望异步加载的数据

            public String call() throws Exception {

                String resu = NetworkTool.httpGetURL(

                             "http://www.baidu.com", "GBK");

                return resu;

            }

        }, new Callback<String>() {

            // 当加载完成后回调,在UI线程中的操作

            public void onCallback(final String resu) {

                if (null != resu) {

                    tv_text1.setText(getRT().text1 + resu);

                } else {

                    Tools.ShowNetErr(HomeActivity.this);

                }

            }

        });
复制代码
这样,就从本来继承AsyncTask创建一个子类,然后初始化,然后运行的开发过程转变为了函数调用的过程。可以看到,调用可是简洁了很多!
为了实现它,我们附上BaseActivity中如下封装代码,需要说明的是这不是我的原创,我借鉴于Andengine引擎的实现代码进行的修改。
附源码:
public class ActivityUtils {

        public static <T> void doAsync(final Context pContext, final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback) {

                ActivityUtils.doAsync(pContext, pTitleResID, pMessageResID, pCallable, pCallback, null, false);

        }

        public static <T> void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable<T> pCallable, final Callback<T> pCallback) {

                ActivityUtils.doAsync(pContext, pTitle, pMessage, pCallable, pCallback, null, false);

        }

        public static <T> void doAsync(final Context pContext, final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback, final boolean pCancelable) {

                ActivityUtils.doAsync(pContext, pTitleResID, pMessageResID, pCallable, pCallback, null, pCancelable);

        }

        public static <T> void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable<T> pCallable, final Callback<T> pCallback, final boolean pCancelable) {

                ActivityUtils.doAsync(pContext, pTitle, pMessage, pCallable, pCallback, null, pCancelable);

        }

        public static <T> void doAsync(final Context pContext, final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {

                ActivityUtils.doAsync(pContext, pTitleResID, pMessageResID, pCallable, pCallback, pExceptionCallback, false);

        }

        public static <T> void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {

                ActivityUtils.doAsync(pContext, pTitle, pMessage, pCallable, pCallback, pExceptionCallback, false);

        }

        public static <T> void doAsync(final Context pContext, final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback, final boolean pCancelable) {

                ActivityUtils.doAsync(pContext, pContext.getString(pTitleResID), pContext.getString(pMessageResID), pCallable, pCallback, pExceptionCallback, pCancelable);

        }

        public static <T> void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback, final boolean pCancelable) {

                new AsyncTask<Void, Void, T>() {

                        private ProgressDialog mPD;

                        private Exception mException = null;

                        @Override

                        public void onPreExecute() {

                                this.mPD = ProgressDialog.show(pContext, pTitle, pMessage, true, pCancelable);

                                if(pCancelable) {

                                        this.mPD.setOnCancelListener(new OnCancelListener() {

                                                @Override

                                                public void onCancel(final DialogInterface pDialogInterface) {

                                                        pExceptionCallback.onCallback(new CancelledException());

                                                        pDialogInterface.dismiss();

                                                }

                                        });

                                }

                                super.onPreExecute();

                        }

                        @Override

                        public T doInBackground(final Void... params) {

                                try {

                                        return pCallable.call();

                                } catch (final Exception e) {

                                        this.mException = e;

                                }

                                return null;

                        }

                        @Override

                        public void onPostExecute(final T result) {

                                try {

                                        this.mPD.dismiss();

                                } catch (final Exception e) {

                                        Log.e("Error", e.toString());

                                }

                                if(this.isCancelled()) {

                                        this.mException = new CancelledException();

                                }

                                if(this.mException == null) {

                                        pCallback.onCallback(result);

                                } else {

                                        if(pExceptionCallback == null) {

                                                if (this.mException != null)

                                                        Log.e("Error", this.mException.toString());

                                        } else {

                                                pExceptionCallback.onCallback(this.mException);

                                        }

                                }

                                super.onPostExecute(result);

                        }

                }.execute((Void[]) null);

        }

        public static <T> void doProgressAsync(final Context pContext, final int pTitleResID, final ProgressCallable<T> pCallable, final Callback<T> pCallback) {

                ActivityUtils.doProgressAsync(pContext, pTitleResID, pCallable, pCallback, null);

        }

        public static <T> void doProgressAsync(final Context pContext, final int pTitleResID, final ProgressCallable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {

                new AsyncTask<Void, Integer, T>() {

                        private ProgressDialog mPD;

                        private Exception mException = null;

                        @Override

                        public void onPreExecute() {

                                this.mPD = new ProgressDialog(pContext);

                                this.mPD.setTitle(pTitleResID);

                                this.mPD.setIcon(android.R.drawable.ic_menu_save);

                                this.mPD.setIndeterminate(false);

                                this.mPD.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

                                this.mPD.show();

                                super.onPreExecute();

                        }

                        @Override

                        public T doInBackground(final Void... params) {

                                try {

                                        return pCallable.call(new IProgressListener() {

                                                @Override

                                                public void onProgressChanged(final int pProgress) {

                                                        onProgressUpdate(pProgress);

                                                }

                                        });

                                } catch (final Exception e) {

                                        this.mException = e;

                                }

                                return null;

                        }

                        @Override

                        public void onProgressUpdate(final Integer... values) {

                                this.mPD.setProgress(values[0]);

                        }

                        @Override

                        public void onPostExecute(final T result) {

                                try {

                                        this.mPD.dismiss();

                                } catch (final Exception e) {

                                        Log.e("Error", e.getLocalizedMessage());

                                        /* Nothing. */

                                }

                                if(this.isCancelled()) {

                                        this.mException = new CancelledException();

                                }

                                if(this.mException == null) {

                                        pCallback.onCallback(result);

                                } else {

                                        if(pExceptionCallback == null) {

                                                Log.e("Error", this.mException.getLocalizedMessage());

                                        } else {

                                                pExceptionCallback.onCallback(this.mException);

                                        }

                                }

                                super.onPostExecute(result);

                        }

                }.execute((Void[]) null);

        }

        public static <T> void doAsync(final Context pContext, final int pTitleResID, final int pMessageResID, final AsyncCallable<T> pAsyncCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {

                final ProgressDialog pd = ProgressDialog.show(pContext, pContext.getString(pTitleResID), pContext.getString(pMessageResID));

                pAsyncCallable.call(new Callback<T>() {

                        @Override

                        public void onCallback(final T result) {

                                try {

                                        pd.dismiss();

                                } catch (final Exception e) {

                                        Log.e("Error", e.getLocalizedMessage());

                                        /* Nothing. */

                                }

                                pCallback.onCallback(result);

                        }

                }, pExceptionCallback);

        }

        

        public static class CancelledException extends Exception {

                private static final long serialVersionUID = -78123211381435595L;

        }

}
复制代码public interface AsyncCallable<T> {

        // ===========================================================

        // Final Fields

        // ===========================================================

        // ===========================================================

        // Methods

        // ===========================================================

        /**

         * Computes a result asynchronously, return values and exceptions are to be handled through the callbacks.

         * This method is expected to return almost immediately, after starting a {@link Thread} or similar.

         *

         * @return computed result

         * @throws Exception if unable to compute a result

         */

        public void call(final Callback<T> pCallback, final Callback<Exception> pExceptionCallback);

}
复制代码public interface Callback<T> {

        // ===========================================================

        // Final Fields

        // ===========================================================

        // ===========================================================

        // Methods

        // ===========================================================

        /**

         * 当加载完成后回调,加载完毕的事后处理  

         */

        public void onCallback(final T pCallbackValue);

}
复制代码public interface IProgressListener {

        // ===========================================================

        // Constants

        // ===========================================================

        // ===========================================================

        // Methods

        // ===========================================================

        /**

         * @param pProgress between 0 and 100.

         */

        public void onProgressChanged(final int pProgress);

}
复制代码public interface IProgressListener {

        // ===========================================================

        // Constants

        // ===========================================================

        // ===========================================================

        // Methods

        // ===========================================================

        /**

         * @param pProgress between 0 and 100.

         */

        public void onProgressChanged(final int pProgress);

}
复制代码public class BaseActivity extends Activity {

        

        /**

         *

         * @param <T> 模板参数,操作时要返回的内容

         * @param pCallable 需要异步调用的操作

         * @param pCallback 回调

         */

        protected <T> void doAsync(final Callable<T> pCallable, final Callback<T> pCallback) {

                ActivityUtils.doAsync(this, null, "内容读取中,请稍等...", pCallable, pCallback, null, false);

        }

        

        protected <T> void doAsync(final CharSequence pTitle, final CharSequence pMessage, final Callable<T> pCallable, final Callback<T> pCallback) {

                ActivityUtils.doAsync(this, pTitle, pMessage, pCallable, pCallback, null, false);

        }

        

        /**

         * Performs a task in the background, showing a {@link ProgressDialog},

         * while the {@link Callable} is being processed.

         *

         * @param <T>

         * @param pTitleResID

         * @param pMessageResID

         * @param pErrorMessageResID

         * @param pCallable

         * @param pCallback

         */

        protected <T> void doAsync(final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback) {

                this.doAsync(pTitleResID, pMessageResID, pCallable, pCallback, null);

        }

        /**

         * Performs a task in the background, showing a indeterminate {@link ProgressDialog},

         * while the {@link Callable} is being processed.

         *

         * @param <T>

         * @param pTitleResID

         * @param pMessageResID

         * @param pErrorMessageResID

         * @param pCallable

         * @param pCallback

         * @param pExceptionCallback

         */

        protected <T> void doAsync(final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {

                ActivityUtils.doAsync(this, pTitleResID, pMessageResID, pCallable, pCallback, pExceptionCallback);

        }

        /**

         * Performs a task in the background, showing a {@link ProgressDialog} with an ProgressBar,

         * while the {@link AsyncCallable} is being processed.

         *

         * @param <T>

         * @param pTitleResID

         * @param pMessageResID

         * @param pErrorMessageResID

         * @param pAsyncCallable

         * @param pCallback

         */

        protected <T> void doProgressAsync(final int pTitleResID, final ProgressCallable<T> pCallable, final Callback<T> pCallback) {

                this.doProgressAsync(pTitleResID, pCallable, pCallback, null);

        }

        /**

         * Performs a task in the background, showing a {@link ProgressDialog} with a ProgressBar,

         * while the {@link AsyncCallable} is being processed.

         *

         * @param <T>

         * @param pTitleResID

         * @param pMessageResID

         * @param pErrorMessageResID

         * @param pAsyncCallable

         * @param pCallback

         * @param pExceptionCallback

         */

        protected <T> void doProgressAsync(final int pTitleResID, final ProgressCallable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {

                ActivityUtils.doProgressAsync(this, pTitleResID, pCallable, pCallback, pExceptionCallback);

        }

        /**

         * Performs a task in the background, showing an indeterminate {@link ProgressDialog},

         * while the {@link AsyncCallable} is being processed.

         *

         * @param <T>

         * @param pTitleResID

         * @param pMessageResID

         * @param pErrorMessageResID

         * @param pAsyncCallable

         * @param pCallback

         * @param pExceptionCallback

         */

        protected <T> void doAsync(final int pTitleResID, final int pMessageResID, final AsyncCallable<T> pAsyncCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {

                ActivityUtils.doAsync(this, pTitleResID, pMessageResID, pAsyncCallable, pCallback, pExceptionCallback);

        }

}
复制代码
回复

使用道具 举报

该用户从未签到

发表于 2011-10-24 10:21:11 | 显示全部楼层

Re:开发交

果断看不懂
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 02:15 , Processed in 0.352869 second(s), 33 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表