MainActivity:

 public class MainActivity extends Activity implements View.OnClickListener {

     ....

     @Override
public void onClick(View v) {
MultiAsynctaskNetwork network = new MultiAsynctaskNetwork(networkInterface);
network.execute();
} private NetworkInterface networkInterface = new NetworkInterface() {
@Override
public void onResult(String result) {
mTvResult.setText(result);
}
}; }

NetworkInterface:

 public interface NetworkInterface {

     void onResult(String result);

 }

MultiAsynctaskNetwork:

 public class MultiAsynctaskNetwork extends MultiAsynctask<Void, Integer, String> {

     private NetworkInterface mInterface;

     public MultiAsynctaskNetwork(NetworkInterface networkInterface) {
this.mInterface = networkInterface;
} @Override
protected String onExecuteTask(Void... params) {
HttpURLConnection connection = null;
try {
URL url = new URL("http://blog.csdn.net/yanzhenjie1003");
connection = (HttpURLConnection) url.openConnection();
int responseCode = connection.getResponseCode();
if (responseCode == ) {
int len = ;
byte[] buffer = new byte[];
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
InputStream inputStream = new BufferedInputStream(connection.getInputStream());
while ((len = inputStream.read(buffer)) != -) {
arrayOutputStream.write(buffer, , len);
}
inputStream.close();
arrayOutputStream.flush();
inputStream.close();
return new String(arrayOutputStream.toByteArray());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null)
connection.disconnect();
}
return "请求网络失败";
} @Override
public void onResult(String result) {// 拿到执行结果,直接更新UI
mInterface.onResult(result);
} }

核心类MultiAsynctask:

 public abstract class MultiAsynctask<Param, Update, Result> {

     /**
* 更新的what
*/
private static final int WHAT_UPDATE = 0x01; /**
* 发送结果的what
*/
private static final int WHAT_RESULT = 0x02; /**
* 默认的线程池
*/
private static ExecutorService sExecutorService; /**
* 默认并发大小
*/
private static final int DEFAULT_POOL_SIZE = ; /**
* 发送结果的Handler
*/
private static Handler sHandler; /**
* Handler的锁
*/
private static Object HANDLER_LOCK = new Object(); /**
* 本地异步任务的执行器
*/
private ExecutorService mExecutorService = null; public MultiAsynctask() {
this(getDufaultExecutor());
} public MultiAsynctask(ExecutorService executorService) {
mExecutorService = executorService;
} /**
* 拿到默认的线程池
*
* @return
*/
private static ExecutorService getDufaultExecutor() {
synchronized (MultiAsynctask.class) {
if (sExecutorService == null)
sExecutorService = Executors.newFixedThreadPool(DEFAULT_POOL_SIZE);
return sExecutorService;
}
} /**
* 设置默认的线程池
*
* @param executorService
*/
public static void setDefaultExecutor(ExecutorService executorService) {
synchronized (MultiAsynctask.class) {
sExecutorService = executorService;
}
} public static Handler getDefaultPoster() {
synchronized (HANDLER_LOCK) {
if (sHandler == null)
sHandler = new Poster();
return sHandler;
}
} /**
* 开始执行任务
*
* @param params
*/
public final void execute(Param... params) {
mExecutorService.execute(new Tasker(params));
} protected abstract Result onExecuteTask(Param... params); /**
* 发送进度更新到主线程
*
* @param update
*/
public final void onPostUpdate(Update update) {
Message.obtain();
Message message = getDefaultPoster().obtainMessage();
message.what = WHAT_UPDATE;
message.obj = new Messager<Param, Update, Result>(this, update, null);
message.sendToTarget();
} /**
* 当返回进度更新的时候
*
* @param update
*/
protected void onUpdate(Update update) {
} /**
* 发送进度执行结果到主线程
*
* @param result
*/
public final void onPostResult(Result result) {
Message.obtain();
Message message = getDefaultPoster().obtainMessage();
message.what = WHAT_RESULT;
message.obj = new Messager<Param, Update, Result>(this, null, result);
message.sendToTarget();
} /**
* 当返回执行结果的时候
*
* @param result
*/
protected void onResult(Result result) { } private static class Messager<Param, Update, Result> { private final MultiAsynctask<Param, Update, Result> asynctask; private final Update update; private final Result result; public Messager(MultiAsynctask<Param, Update, Result> asynctask, Update update, Result result) {
this.asynctask = asynctask;
this.update = update;
this.result = result;
} /**
* 调用当前MultiAsynctask的主线程更新方法
*/
public void onUpdate() {
asynctask.onUpdate(update);
} /**
* 调用当前MultiAsynctask的主线程结果方法
*/
public void onResult() {
asynctask.onResult(result);
} } /**
* <p>
* 线程间通信使者
* </p>
* Created in Mar 27, 2016 10:00:03 PM.
*
* @author Yolanda;
*/
private static class Poster extends Handler { public Poster() {
super(Looper.getMainLooper());
} @Override
public void handleMessage(Message msg) {
Messager<?, ?, ?> messageer = (Messager<?, ?, ?>) msg.obj;
if (msg.what == WHAT_RESULT) {
messageer.onResult();
} else if (msg.what == WHAT_UPDATE) {
messageer.onUpdate();
}
}
} /**
* <p>
* 任务执行器
* </p>
* Created in Mar 27, 2016 10:03:44 PM.
*
* @author Yolanda;
*/
private class Tasker implements Runnable { private Param[] params; public Tasker(Param... params) {
this.params = params;
} @Override
public void run() {
Result result = onExecuteTask(params);
onPostResult(result);
}
} }

NoHttp封装--07 自定义异步任务框架的更多相关文章

  1. 爬虫之多线程 多进程 自定义异步IO框架

    什么是进程? 进程是程序运行的实例,是系统进行资源分配和调度的一个独立单位,它包括独立的地址空间,资源以及1个或多个线程. 什么是线程? 线程可以看成是轻量级的进程,是CPU调度和分派的基本单位. 进 ...

  2. 自定义异步IO框架

    异步就是回调 异步 = 非阻塞+循环 select只能完成IO多路复用,不能完成异步 IO多路复用--->监听多个socket对象,这个过程是同步的 利用其特性可以开发异步模块 异步IO:非阻塞 ...

  3. NoHttp封装--02 自定义请求

    bean实体类请求: 1.bean import java.io.Serializable; import com.alibaba.fastjson.annotation.JSONField; pub ...

  4. Android 异步查询框架AsyncQueryHandler的使用

    AsyncQueryHandler简介: 异步的查询操作帮助类,可以处理增删改(ContentProvider提供的数据) 使用场景: 在一般的应用中可以使用ContentProvider去操作数据库 ...

  5. 03: 自定义异步非阻塞tornado框架

    目录:Tornado其他篇 01: tornado基础篇 02: tornado进阶篇 03: 自定义异步非阻塞tornado框架 04: 打开tornado源码剖析处理过程 目录: 1.1 源码 1 ...

  6. Android 从零开始打造异步处理框架

    转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/5995752.html 本文出自[赵彦军的博客] 概述 在Android中会使用异步任务来处理耗时操作,避免出 ...

  7. Android 玩转IOC,Retfotit源码解析,教你徒手实现自定义的Retrofit框架

    CSDN:码小白 原文地址: http://blog.csdn.net/sk719887916/article/details/51957819 前言 Retrofit用法和介绍的文章实在是多的数不清 ...

  8. python---爬虫相关性能(各个异步模块的使用,和自定义异步IO模块)

    一:线程池,进程池等相关文章了解 python---基础知识回顾(十)进程和线程(py2中自定义线程池和py3中的线程池使用) python---基础知识回顾(十)进程和线程(协程gevent:线程在 ...

  9. 超轻量级异步JS框架,别再让嵌套影响我们的优雅代码!

    1.异步JS的重要性 随着Web平台地位的提升,霸占着浏览器的JavaScript语言也成为了世界上最流行的语言之一,甚至通过Node.js进入了服务器编程领域.JavaScript的一个重要特性便是 ...

随机推荐

  1. Docker简介以及操作

    Docker 简介 Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linu ...

  2. 'QueryDict' object is not callable 错误解析

    我把request内置库和 requests库  给搞混了 requests使用来发送请求的, request 而是用来获取数据的 别看只有一个单词只差,却让我找了大半天 requests.post( ...

  3. [学习笔记]利用e-debug和GetWindowTextA破解CM课件

    本课是针对注册时候的报错弹窗不是信息框MessageBox,而是窗体的情况 首先打开课件看一下 既然课件是个易语言程序,那使用E-DEBUG试试 E-DEBUG打开课件,点击“start”,课件弹出登 ...

  4. js对象按某个字段排序

    var arr = [ {name:'zopp',age:0}, {name:'gpp',age:18}, {name:'yjj',age:8} ]; function compare(propert ...

  5. java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  6. [ Talk is Cheap Show me the CODE ] : jQuery Mobile页面布局

    当我们专注地研究人类生活的空虚,并考虑荣华富贵空幻无常时,也许我们正在阿谀逢迎自己懒惰的天性. Written In The Font 为了app的手机端,我选择了 jQuery Mobile  ,学 ...

  7. Core2.0知识整理

    概述 Commond-Line ASP.NET结构文件 Startup 配置文件 中间件和依赖注入 依赖注入原理 框架自带的依赖注入(IServiceCollection) 依赖注入生命周期 依赖注入 ...

  8. 【干货】利用MVC5+EF6搭建博客系统(四)(下)前后台布局实现、发布博客以及展示

    二.博客系统后台布局实现 2.1.这里所用的是MVC的布局页来实现的,后台主要分为三部分:导航.菜单.主要内容 代码实现: 这里把后台单独放在一个区域里面,所以我这里建立一个admin的区域 在布局页 ...

  9. 进程间通信IPC-消息队列

    前言: 消息队列就是一个消息的链表.可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向其中按照一定的规则添加新消息:对消息队列有读权限的进程则可以从消息队列中读走消 ...

  10. shell编程基础(三): 位置参数与shell脚本的输入输出

    一.位置参数和特殊变量 有很多特殊变量是被Shell自动赋值的,我们已经遇到了$?和$1,现在总结一下: 常用的位置参数和特殊变量: $0 相当于C语言main函数的argv[0] $1.$2... ...