NoHttp封装--07 自定义异步任务框架
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 自定义异步任务框架的更多相关文章
- 爬虫之多线程 多进程 自定义异步IO框架
什么是进程? 进程是程序运行的实例,是系统进行资源分配和调度的一个独立单位,它包括独立的地址空间,资源以及1个或多个线程. 什么是线程? 线程可以看成是轻量级的进程,是CPU调度和分派的基本单位. 进 ...
- 自定义异步IO框架
异步就是回调 异步 = 非阻塞+循环 select只能完成IO多路复用,不能完成异步 IO多路复用--->监听多个socket对象,这个过程是同步的 利用其特性可以开发异步模块 异步IO:非阻塞 ...
- NoHttp封装--02 自定义请求
bean实体类请求: 1.bean import java.io.Serializable; import com.alibaba.fastjson.annotation.JSONField; pub ...
- Android 异步查询框架AsyncQueryHandler的使用
AsyncQueryHandler简介: 异步的查询操作帮助类,可以处理增删改(ContentProvider提供的数据) 使用场景: 在一般的应用中可以使用ContentProvider去操作数据库 ...
- 03: 自定义异步非阻塞tornado框架
目录:Tornado其他篇 01: tornado基础篇 02: tornado进阶篇 03: 自定义异步非阻塞tornado框架 04: 打开tornado源码剖析处理过程 目录: 1.1 源码 1 ...
- Android 从零开始打造异步处理框架
转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/5995752.html 本文出自[赵彦军的博客] 概述 在Android中会使用异步任务来处理耗时操作,避免出 ...
- Android 玩转IOC,Retfotit源码解析,教你徒手实现自定义的Retrofit框架
CSDN:码小白 原文地址: http://blog.csdn.net/sk719887916/article/details/51957819 前言 Retrofit用法和介绍的文章实在是多的数不清 ...
- python---爬虫相关性能(各个异步模块的使用,和自定义异步IO模块)
一:线程池,进程池等相关文章了解 python---基础知识回顾(十)进程和线程(py2中自定义线程池和py3中的线程池使用) python---基础知识回顾(十)进程和线程(协程gevent:线程在 ...
- 超轻量级异步JS框架,别再让嵌套影响我们的优雅代码!
1.异步JS的重要性 随着Web平台地位的提升,霸占着浏览器的JavaScript语言也成为了世界上最流行的语言之一,甚至通过Node.js进入了服务器编程领域.JavaScript的一个重要特性便是 ...
随机推荐
- Docker简介以及操作
Docker 简介 Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linu ...
- 'QueryDict' object is not callable 错误解析
我把request内置库和 requests库 给搞混了 requests使用来发送请求的, request 而是用来获取数据的 别看只有一个单词只差,却让我找了大半天 requests.post( ...
- [学习笔记]利用e-debug和GetWindowTextA破解CM课件
本课是针对注册时候的报错弹窗不是信息框MessageBox,而是窗体的情况 首先打开课件看一下 既然课件是个易语言程序,那使用E-DEBUG试试 E-DEBUG打开课件,点击“start”,课件弹出登 ...
- js对象按某个字段排序
var arr = [ {name:'zopp',age:0}, {name:'gpp',age:18}, {name:'yjj',age:8} ]; function compare(propert ...
- java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- [ Talk is Cheap Show me the CODE ] : jQuery Mobile页面布局
当我们专注地研究人类生活的空虚,并考虑荣华富贵空幻无常时,也许我们正在阿谀逢迎自己懒惰的天性. Written In The Font 为了app的手机端,我选择了 jQuery Mobile ,学 ...
- Core2.0知识整理
概述 Commond-Line ASP.NET结构文件 Startup 配置文件 中间件和依赖注入 依赖注入原理 框架自带的依赖注入(IServiceCollection) 依赖注入生命周期 依赖注入 ...
- 【干货】利用MVC5+EF6搭建博客系统(四)(下)前后台布局实现、发布博客以及展示
二.博客系统后台布局实现 2.1.这里所用的是MVC的布局页来实现的,后台主要分为三部分:导航.菜单.主要内容 代码实现: 这里把后台单独放在一个区域里面,所以我这里建立一个admin的区域 在布局页 ...
- 进程间通信IPC-消息队列
前言: 消息队列就是一个消息的链表.可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向其中按照一定的规则添加新消息:对消息队列有读权限的进程则可以从消息队列中读走消 ...
- shell编程基础(三): 位置参数与shell脚本的输入输出
一.位置参数和特殊变量 有很多特殊变量是被Shell自动赋值的,我们已经遇到了$?和$1,现在总结一下: 常用的位置参数和特殊变量: $0 相当于C语言main函数的argv[0] $1.$2... ...