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. sql server 备份与恢复系列二 事务日志概述

    1.1  日志文件与数据文件一致性 在上一章备份与恢复里了解到事务日志的重要性,这篇重点来了解事务日志. 事务日志记录了数据库所有的改变,能恢复该数据库到改变之前的任意状态.在sql server实例 ...

  2. Spring 依赖注入方式详解(四)

    IoC 简介 平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想 ...

  3. 【深度学习与TensorFlow 2.0】入门篇

    注:因为毕业论文需要用到相关知识,借着 TF 2.0 发布的时机,重新捡起深度学习.在此,也推荐一下优达学城与 TensorFlow 合作发布的TF 2.0入门课程,下面的例子就来自该课程. 原文发布 ...

  4. zookeeper服务发现实战及原理--spring-cloud-zookeeper源码分析

    1.为什么要服务发现? 服务实例的网络位置都是动态分配的.由于扩展.失败和升级,服务实例会经常动态改变,因此,客户端代码需要使用更加复杂的服务发现机制. 2.常见的服务发现开源组件 etcd—用于共享 ...

  5. Python面向对象基础:编码细节和注意事项

    在前面,我用了3篇文章解释python的面向对象: 面向对象:从代码复用开始 面向对象:设置对象属性 类和对象的名称空间 本篇是第4篇,用一个完整的示例来解释面向对象的一些细节. 例子的模型是父类Em ...

  6. linux内核源码目录结构分析

    原文地址 /arch.arch是architecture的缩写.arch目录下是好多个不同架构的CPU的子目录,譬如arm这种cpu的所有文件都在arch/arm目录下,X86的CPU的所有文件都在a ...

  7. Android Studio 日志工具

    在项目中提供5个方法打印日志 Log.v() 最常见的日志信息 Log.d() 调试信息 Log.i() 用于打印用户操作行为 Log.w()警告潜在风险 Log.e()报错信息 TAG 填入类名就好 ...

  8. Linux服务器评测脚本 中文IO脚本简单易懂

    中文版: wget -N --no-check-certificate https://raw.githubusercontent.com/FunctionClub/ZBench/master/ZBe ...

  9. java_自定义标签运行原理

    一.自定义标签运行原理: 二.文字说明 1.IE->web服务器 2.Web服务器->jsp 3.遇到自定义标签,首先实例化标签所对应的标签处理器类 4.调用setPageContext方 ...

  10. python网络编程-udp

    目录 1. 创建socket 2. udp网络程序-发送数据 3. udp网络程序-接收数据 4. python3中的编码转换 5. udp端口绑定 1. 创建socket 在 Python 中 使用 ...