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的一个重要特性便是 ...
随机推荐
- linux定时任务执行没结果,手动执行有结果问题总结
今天写了个脚本手动执行有结果,但是放到系统定时任务跑却没结果,之前也遇到这种问题解决了没记录后面又懵逼了一次~~~ 如下图: 手动执行有结果 放到定时任务中每五分钟执行一次 解决方法: 脚本中加载系统 ...
- skywalking部署
官方文档:Setup java agent Backend and UI 下载地址:http://skywalking.apache.org/downloads/ 解压后目录 部署UI和收集器 进入w ...
- Unity3D热更新之LuaFramework篇[03]--prefab加载和Button事件
在上一篇文章 Unity3D热更新之LuaFramework篇[02]--用Lua创建自己的面板 中,我介绍了LuaFramework加载面板的方法,但这个方法并不适用于其它Prefab资源,在这套框 ...
- gradle 自定义插件 下载配置文件
1.新建Gradle项目: 2.建立src/main/groovy目录,并添加如下代码: ConfigPlugin.groovy package com.wemall.config import or ...
- MyBatis源码解析(一)——执行流程
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6603926.html 一.MyBatis简介 MyBatis框架是一种轻量级的ORM框架, ...
- 【学习笔记】node.js重构路由功能
摘要:利用node.js模块化实现路由功能,将请求路径作为参数传递给一个route函数,这个函数会根据参数调用一个方法,最后输出浏览器响应内容 1.介绍 node.js是一个基于Chrome V8引擎 ...
- MySQL 索引与查询优化
本文介绍一些优化 MySQL 索引设计和查询的建议.在进行优化工作前,请务必了解MySQL EXPLAIN命令: 查看执行计划 索引 索引在逻辑上是指从索引列(关键字)到数据的映射,通过索引可以快速的 ...
- MySQL/MariaDB表表达式(3):视图
视图是表表达式的一种,所以它也是虚拟表.对视图操作的时候会通过语句动态的从表中临时获取数据. 1.创建.修改视图 CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED ...
- sharding:谁都能读懂的分库、分表、分区
本文通过大量图片来分析和描述分库.分表以及数据库分区是怎样进行的. 1.sharding前的初始数据分布 在本文中,我打算用高考考生相关信息作为实验数据.请无视表的字段是否符合现实,也请无视表的设计是 ...
- KeepAlived(三):vrrp实例故障转移(keepalived+haproxy)
keepalived使用脚本进行健康检查时的相关配置项.例如keepalived+haproxy实现haproxy的高可用. keepalived分为vrrp实例的心跳检查和后端服务的健康检查.如果要 ...