- 浏览: 18273 次
最新评论
-
ygswine:
很是感谢, 你的博文对我很有用. 谢谢
android下如何设置系统时间 -
jyh149129:
我android新手,能否给我个ViewFlipper 调用的 ...
异步下载图片+图片缓存 -
iwangxiaodong:
补充一个Android 应用视觉效果设计技巧:http://w ...
android小技巧收集 -
573842281:
压缩包里面没有什么东西啊!
仿淘宝"摇一摇"
对AsyncTask进行封装,简化繁琐的异步操作。
- 博客分类:
- android应用
对于android的异步操作,往往有二种方法给予我们选择。
一:Thread+Handler
二: AsyncTask
对于二者的相同与异同点,这里并不去进行比较。这里提供一种简化异步操作的方法,供大家参考学习。
代码参考自AndEngine,不过我对它做了一定的修改,让它更适合自己目前项目的开发,感谢open source 能够让我们去学习和阅读那么多优秀的代码。
废话不多说,代码如下:
CallEarliest<T>:
/** * * 回调接口,回调方法运行于主线程 * @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>:
/**
* 回调接口,回调方法运行于异步线程 * @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>:
/**
* 回调接口,回调方法运行于主线程 * @ClassName: Callback * @author 姜涛 * @version 1.0 2012-1-16 下午5:58:16 * @param <T> */ public interface Callback<T> { public void onCallback(final T pCallbackValue); }
IProgressListener:
/**
* 观察者 * @ClassName: IProgressListener * @author 姜涛 * @version 1.0 2012-1-16 下午11:08:40 */ public interface IProgressListener { /** * 进度发生改变的时候调用 * @param pProgress */ public void onProgressChanged(final int pProgress); }
ProgressCallable<T>:
/** * 被观察者 * @ClassName: ProgressCallable * @author 姜涛 * @version 1.0 2012-1-16 下午11:08:52 * @param <T> */ public interface ProgressCallable<T> { /** * 注册观察者对象 * @param pProgressListener * @return * @throws Exception */ public T call(final IProgressListener pProgressListener) throws Exception; }
AsyncTaskUtils:
/** * 异步操作工具类 * @ClassName: ActivityUtils * @author 姜涛 * @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()); } } /** * 第二步执行这个方法,这个方法运行在异步线程中 */ @Override protected T doInBackground(Void... params) { try { return pCallable.call(); } catch (Exception e) { Log.e("error", e.toString()); } 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 pCallEarliest * 运行于主线程,最先执行此方法. * @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) { new AsyncTask<Void, Void, T>() { private ProgressDialog mProgressDialog; /** * 首先运行此方法,运行于主线程 */ @Override protected void onPreExecute() { super.onPreExecute(); mProgressDialog = new ProgressDialog(pContext); mProgressDialog.setProgressStyle(styleID); mProgressDialog.setTitle(pTitle); mProgressDialog.setMessage(pMessage); mProgressDialog.setIndeterminate(false); mProgressDialog.show(); try { pCallEarliest.onCallEarliest(); } catch (Exception e) { Log.e("error", e.toString()); } } /** * 第二步执行这个方法,这个方法运行在异步线程中 */ @Override protected T doInBackground(Void... params) { try { return progressCallable.call(new IProgressListener() { @Override public void onProgressChanged(int pProgress) { // TODO Auto-generated method stub onProgressUpdate(pProgress); } }); } catch (Exception e) { Log.e("error", e.toString()); } return null; } /** * 更新进度框 */ protected void onProgressUpdate(final Integer... values) { mProgressDialog.setProgress(values[0]); }; /** * 第三步执行这个方法,运行于主线程 */ protected void onPostExecute(T result) { if (mProgressDialog != null) mProgressDialog.dismiss(); pCallback.onCallback(result); } }.execute((Void[]) null); } /** * 封装的asynctask方法,此方法拥有进度对话框,并支持定义样式. * * @param pContext * 上下文 * @param styleID * 对话框样式 * ProgressDialog.STYLE_HORIZONTAL|ProgressDialog.STYLE_SPINNER * @param pTitle * 标题,资源id * @param pMessage * 内容,资源id * @param pCallEarliest * 运行于主线程,最先执行此方法. * @param progressCallable * 运行于异步线程,用于传递对话框进度. * @param pCallback * 运行于主线程,最后执行此方法. */ public static <T> void doProgressAsync(final Context pContext, final int styleID, final int pTitleResId, final int pMessageResId, final CallEarliest<T> pCallEarliest, final ProgressCallable<T> progressCallable, final Callback<T> pCallback) { AsyncTaskUtils.doProgressAsync(pContext, styleID, pContext.getString(pTitleResId), pContext.getString(pMessageResId), pCallEarliest, progressCallable, pCallback); } }
BaseActivity:
/** * 公用Activity,用于存放与业务无关的公用方法 * * @ClassName: BaseActivity * @author 姜涛 * @version 1.0 2011-12-11 下午7:03:18 */ public abstract class BaseActivity extends Activity { /** * 封装的asynctask方法,此方法没有进度框. * * @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); } /** * 封装的asynctask方法,此方法拥有进度对话框,并支持定义样式. * @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, final Callback<T> pCallback) { AsyncTaskUtils.doProgressAsync(pContext, styleID, pTitleResID, pMessageResID, pCallEarliest, pCallable, pCallback); } /** * 封装的asynctask方法,此方法拥有进度对话框,并支持定义样式. * @param pContext 上下文 * @param styleID 对话框样式 ProgressDialog.STYLE_HORIZONTAL|ProgressDialog.STYLE_SPINNER * @param pTitle 标题,资源id * @param pMessage 内容,资源id * @param pCallEarliest 运行于主线程,最先执行此方法. * @param progressCallable 运行于异步线程,用于传递对话框进度. * @param pCallback 运行于主线程,最后执行此方法. */ public <T> void doProgressAsync(final Context pContext, final int styleID, final int pTitleResID, final int pMessageResID, final CallEarliest<T> pCallEarliest, final ProgressCallable<T> pCallable, final Callback<T> pCallback) { AsyncTaskUtils.doProgressAsync(pContext, styleID, pTitleResID, pMessageResID, pCallEarliest, pCallable, pCallback); } }
SimpleAsyncTaskActivity:
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>() { @Override public Void call(IProgressListener pProgressListener) throws Exception { // TODO Auto-generated method stub for (int i = 0; i < 100; i++) { Thread.sleep(200); pProgressListener.onProgressChanged(i); } return null; } }, new Callback<Void>() { @Override public void onCallback(Void pCallbackValue) { // TODO Auto-generated method stub } }); } }
效果图:
示例可参见附件.
发表评论
-
android下如何设置系统时间
2013-04-09 23:58 5897最近做项 ... -
android小技巧收集
2012-08-15 05:15 2042一: 为应用程序设置 ... -
Android退出整个应用的方法
2012-08-13 03:10 1515对于网上所提供的杀进程,杀包等方式不予评价,这里提供一下 ... -
我的音乐播放器之旅(2)-模版化框架开发
2012-02-22 11:39 0从android3.0开始,引入了Action Bar的概念, ... -
我的音乐播放器之旅(1)-模仿思路
2012-02-21 22:23 77一:选型 从有做 ... -
我的音乐播放器之旅---索引贴
2012-02-21 17:37 66最近公司项目比较闲,想做点东西练练手,顺便把这么久时间来做an ... -
仿淘宝"摇一摇"
2012-02-02 13:41 1436前几天看到淘宝最新的客户端有一个弱网络情况数据加载超时,手持摇 ... -
对AsyncTask进行封装,简化繁琐的异步操作。
2012-01-17 11:10 0对于android的异步操作,往往有二种方法给予我们 ... -
异步下载图片+图片缓存
2012-01-15 19:02 2835代码参考自:jamendo,有一定修改。 ...
相关推荐
AsyncTask_简单演示AsyncTask异步操作,写一个简单的AsyncTask异步操作解决上一篇文章提到的线程阻塞问题,对应我的博客《网易博客迁移:Android专题之AsyncTask(二)简单演示AsyncTask异步操作》,有问题欢迎留言...
Android AsyncTask用法和异步加载图片通过AsyncTask 从网络上异步加载一张图片
AsyncTask实例代码演示Android异步任务.txt AsyncTask实例代码演示Android异步任务.txt
android 任务后台处理事物 asyncTask封装
对AsyncTask的封装,方便易用。大家多提意见。
AsyncTask是Android为了简化异步操作而封装的异步任务操作抽象类。当我们需要在程序中执行耗时的异步操作时,我们可以考虑使用AsyncTask来实现。
通过AsyncTask 从网络上异步加载一张图片
Android AsyncTask异步处理下载网页
主要讲AsyncTask一些主要方法的使用和有关进度条的一个简单例子,对应我的博客《Android专题之AsyncTask(三)异步方法操作之进度条》,有问题欢迎留言讨论。。。
Android异步任务下载一张图片,关键是异步任务的流程,带进度条的异步任务
Android 使用AsyncTask异步更新UI界面
AsyncTask可以在子线程中更新ui,封装简化了异步操作。适用于简单的异步处理。如果多个后台任务时就要使用Handler了 在这里就不再说明。 AsyncTask通常用于被继承。AsyncTask定义了三种泛型类型<Para
以从网上下载图片为例,讲解Android自带的异步操作类----AsyncTask类的用法 public class DownloadPicture extends AsyncTask, Integer, Bitmap> 其中包含三个异步操作类可供测试
本压缩包主要包括一个AsyncTask异步请求的demo,以及一个讲解AsyncTask流程及用法的文档说明,希望能帮到你
Android Handler AsyncTask 异步加载
Android为了降低这个开发难度 提供了AsyncTask AsyncTask就是一个封装过的后台任务类 顾名思义就是异步任务 AsyncTask直接继承于Object类 位置为android os AsyncTask 要使用AsyncTask工作我们要提供三个泛型参数 ...
Android异步处理二:使用AsyncTask异步更新UI界面。
本文简单介绍了如何使用异步线程实现手机与其他服务器端接口进行通讯
http://blog.csdn.net/rwyz1314/article/details/6841639 的代码。放在这里做为备份。上一个文件传错了。也没法删除。只好重新传一个。