AsyncTask在本专栏已经做过详细的解析,但是AsyncTask函数式的调用这个概念对大多数人来说比较陌生。其实本质就是自己封装AsyncTask,让暴露的方法,看不到一点AsyncTask的身影。

今天就讲讲对AsyncTask封装的过程。

新建一个AsyncTaskUtils类:

public class AsyncTaskUtils {
public static <T> void doAsync(final IDataCallBack<T> callBack) {
new AsyncTask<Void, Void, T>() { protected void onPreExecute() {
callBack.onTaskBefore();
}; @Override
protected T doInBackground(Void... params) {
// TODO
return callBack.onTasking(params);
} protected void onPostExecute(T result) {
callBack.onTaskAfter(result);
}; }.execute();
}
}

在doAsync中匿名类的方式重写AsyncTask,然后要在对应的方法中使用接口回调的方式,把工具类里面的这三个功能传递出去(不同的模块进行传值,考虑使用接口回调)。调用接口中三个功能相同的方法(实际调用实现类的方法)。执行doInBackground返回值用泛型指定。

对应的接口如下:

public interface IDataCallBack<T> {
/**任务执行之前*/
void onTaskBefore(); /**任务执行中...*/
T onTasking(Void... params); /**任务执行之后*/
void onTaskAfter(T result); }

onTasking是对应doInBackground方法来的,因此要有返回值,使用泛型指定。

定义一个活动的基类BaseActivity:

public class BaseActivity extends Activity {

	public <T> void doAsync(IDataCallBack<T> callBack) {
AsyncTaskUtils.doAsync(callBack);
} }

在一个活动中,要想执行耗时操作。就可以继承自BaseActivity。例如下面,点击按钮执行访问网络。就重写doAsync。里面的接口实现方法,就类似xUtils工具类里面的HttpUtils的使用差不多。这样只需要关心

/**任务执行之前*/
void onTaskBefore(); /**任务执行中...*/
T onTasking(Void... params); /**任务执行之后*/
void onTaskAfter(T result);

三个实现类方法就好了。AsyncTask就通过函数调用的方式来完成了操作。

public class MainActivity extends BaseActivity {

	@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); findViewById(R.id.btn2).setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
MainActivity.this.doAsync(new IDataCallBack<String>() {//该耗时操作,返回值类型是一个String类型 @Override
public void onTaskBefore() {
} @Override
public String onTasking(Void... params) {//耗时的具体操作
String result = "";
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet get = new HttpGet("http://www.baidu.com");
HttpResponse response = httpClient.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
result = EntityUtils.toString(response.getEntity());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
} @Override
public void onTaskAfter(String result) {
System.out.println(result);
}
});
}
});
}

运行结果,发现可以正常使用~

AsyncTask函数化的封装,AsyncTask函数式的调用 就讲完了。

喜欢我的朋友可以关注我哦~

也可以扫描下方的二维码,或搜索公众号  Android程序员开发指南  去微信每日阅读一篇安卓开发文章。

长按上方二维码,关注本公众号一起交流Android开发技术。

AsyncTask函数化的封装,AsyncTask函数式的调用的更多相关文章

  1. AsyncTask 的 get post 封装

    1.get方法的封装AsyncTask public class DBUTil2 { public static interface Succee{ void onSuccee(String resu ...

  2. 函数式编程 —— 将 JS 方法函数化

    前言 JS 调用方法的风格为 obj.method(...),例如 str.indexOf(...),arr.slice(...).但有时出于某些目的,我们不希望这种风格.例如 Node.js 的源码 ...

  3. C#利用Emit反射实现AOP,以及平台化框架封装思路

    C#利用Emit反射实现AOP,以及平台化框架封装思路 这是前两天扒的一段动态代理AOP代码,用的Emit反射生成子类来实现代理模式,在这里做个小笔记,然后讨论一下AOP框架的实现思路. 首先是主函数 ...

  4. 《JavaScript语言精粹》之函数化

    写在前面 看到好多书评和读书笔记都说<JavaScript语言精粹>字字珠玑,名不虚传..当然,要看得懂才行 其实个人认为函数化部分不是很好,举的例子不是十分恰当,之前看不懂是因为被成功误 ...

  5. Thinkphp3.2.3框架下封装公共的函数,例如封装CURL函数来获取接口数据

    当我们需要在控制层调用相同的封装函数时,写多次相同的函数,显得代码十分的拉杂,不精简: TP框架有一个很好的机制,可以再Common定义一个function.php函数,当我们在控制层调用的时候直接调 ...

  6. [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...

  7. 【转】【Html】Vuejs2.0学习之二(Render函数,createElement,vm.$slots,函数化组件,模板编译,JSX)

    1.Render函数 所以直接来到Render,本来也想跳过,发现后面的路由貌似跟它还有点关联.先来看看Render 1.1 官网一开始就看的挺懵的,不知道讲的是啥,动手试了一下,一开头讲的是Rend ...

  8. js对函数参数的封装

    对函数参数的封装 一个原始函数有n个参数,用wrap对函数进行封装,生成一个新的函数,当给它传入参数数量为n的时候,将执行原始函数,否则不执行 //函数封装 function wrap(func){ ...

  9. 【转】 Pro Android学习笔记(九二):AsyncTask(1):AsyncTask类

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在Handler的学习系列中,学习了如何h ...

随机推荐

  1. Convert.ToInt32、(int)和int.Parse三者的区别

    前者适合将object类类型转换成int类型 (int)适合简单数据类型之间的转换: int.Parse适合将string类类型转换成int类型.

  2. 1020关于MYCAT的安装和使用总结

    第一部分 读写分离配置 转自:http://www.51testing.com/html/34/369434-3686088.html 使用Mycat 做简单的读写分离(一) 原本使用的是amoeba ...

  3. python-复杂生成式

    1.复杂的列表生成式HTML表格: 注:字符串可以通过%进行格式,用指定的参数化代替%s.字符串的join()方法可以把一list拼接成一个字符串. 把没有几个的分数标记为红色: d = { 'Ada ...

  4. 【PYTHON】用户登录三次错误锁定

    黑名单:blacklist.txt 用户名单:username_password.py # Author:Stephen Yuan # 用户名和密码 username_password = { ', ...

  5. [LeetCode] Circular Array Loop 环形数组循环

    You are given an array of positive and negative integers. If a number n at an index is positive, the ...

  6. pytorch 移动端框架 thnets 附c示例代码

    前年年前做一个手机移动端图像识别项目的时候, 先后尝试了mxnet,thnets,caffe,tensorflow. 当时的情况是,mxnet内存管理奇差,内存经常由于模型运算分配不足,app挂掉. ...

  7. 计蒜客NOIP模拟赛(2) D2T2紫色百合

    [问题描述] “牵着你的手的是她,路边开满了紫色的百合花……” 你从梦中醒来,却依然忘不了梦中的她百合花,每朵百合花都有一个权值,在二进制下写成一行‘1’,第i朵紫色百合的权值在二进制下写成i个‘1’ ...

  8. hdu 5122(2014北京—dp)

    题意: 从n个数中任选一些数,问有多少种选法使他们异或和不小于M 思路: dp[i][j]表示选i个数异或和为j,则方程dp[i][j] = dp[i-1][j](不选i)+ dp[i-1][j^a[ ...

  9. python中type dtype astype 的用法

    1.type 获取数据类型 2.dtype 数组元素的类型 3.astype 修改数据类型

  10. sql server 表分区

    背景: 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的 ...