MainActivity:

  1. public class MainActivity extends Activity implements View.OnClickListener {
  2.  
  3. ....
  4.  
  5. @Override
  6. public void onClick(View v) {
  7. MultiAsynctaskNetwork network = new MultiAsynctaskNetwork(networkInterface);
  8. network.execute();
  9. }
  10.  
  11. private NetworkInterface networkInterface = new NetworkInterface() {
  12. @Override
  13. public void onResult(String result) {
  14. mTvResult.setText(result);
  15. }
  16. };
  17.  
  18. }

NetworkInterface:

  1. public interface NetworkInterface {
  2.  
  3. void onResult(String result);
  4.  
  5. }

MultiAsynctaskNetwork:

  1. public class MultiAsynctaskNetwork extends MultiAsynctask<Void, Integer, String> {
  2.  
  3. private NetworkInterface mInterface;
  4.  
  5. public MultiAsynctaskNetwork(NetworkInterface networkInterface) {
  6. this.mInterface = networkInterface;
  7. }
  8.  
  9. @Override
  10. protected String onExecuteTask(Void... params) {
  11. HttpURLConnection connection = null;
  12. try {
  13. URL url = new URL("http://blog.csdn.net/yanzhenjie1003");
  14. connection = (HttpURLConnection) url.openConnection();
  15. int responseCode = connection.getResponseCode();
  16. if (responseCode == ) {
  17. int len = ;
  18. byte[] buffer = new byte[];
  19. ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
  20. InputStream inputStream = new BufferedInputStream(connection.getInputStream());
  21. while ((len = inputStream.read(buffer)) != -) {
  22. arrayOutputStream.write(buffer, , len);
  23. }
  24. inputStream.close();
  25. arrayOutputStream.flush();
  26. inputStream.close();
  27. return new String(arrayOutputStream.toByteArray());
  28. }
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. } finally {
  32. if (connection != null)
  33. connection.disconnect();
  34. }
  35. return "请求网络失败";
  36. }
  37.  
  38. @Override
  39. public void onResult(String result) {// 拿到执行结果,直接更新UI
  40. mInterface.onResult(result);
  41. }
  42.  
  43. }

核心类MultiAsynctask:

  1. public abstract class MultiAsynctask<Param, Update, Result> {
  2.  
  3. /**
  4. * 更新的what
  5. */
  6. private static final int WHAT_UPDATE = 0x01;
  7.  
  8. /**
  9. * 发送结果的what
  10. */
  11. private static final int WHAT_RESULT = 0x02;
  12.  
  13. /**
  14. * 默认的线程池
  15. */
  16. private static ExecutorService sExecutorService;
  17.  
  18. /**
  19. * 默认并发大小
  20. */
  21. private static final int DEFAULT_POOL_SIZE = ;
  22.  
  23. /**
  24. * 发送结果的Handler
  25. */
  26. private static Handler sHandler;
  27.  
  28. /**
  29. * Handler的锁
  30. */
  31. private static Object HANDLER_LOCK = new Object();
  32.  
  33. /**
  34. * 本地异步任务的执行器
  35. */
  36. private ExecutorService mExecutorService = null;
  37.  
  38. public MultiAsynctask() {
  39. this(getDufaultExecutor());
  40. }
  41.  
  42. public MultiAsynctask(ExecutorService executorService) {
  43. mExecutorService = executorService;
  44. }
  45.  
  46. /**
  47. * 拿到默认的线程池
  48. *
  49. * @return
  50. */
  51. private static ExecutorService getDufaultExecutor() {
  52. synchronized (MultiAsynctask.class) {
  53. if (sExecutorService == null)
  54. sExecutorService = Executors.newFixedThreadPool(DEFAULT_POOL_SIZE);
  55. return sExecutorService;
  56. }
  57. }
  58.  
  59. /**
  60. * 设置默认的线程池
  61. *
  62. * @param executorService
  63. */
  64. public static void setDefaultExecutor(ExecutorService executorService) {
  65. synchronized (MultiAsynctask.class) {
  66. sExecutorService = executorService;
  67. }
  68. }
  69.  
  70. public static Handler getDefaultPoster() {
  71. synchronized (HANDLER_LOCK) {
  72. if (sHandler == null)
  73. sHandler = new Poster();
  74. return sHandler;
  75. }
  76. }
  77.  
  78. /**
  79. * 开始执行任务
  80. *
  81. * @param params
  82. */
  83. public final void execute(Param... params) {
  84. mExecutorService.execute(new Tasker(params));
  85. }
  86.  
  87. protected abstract Result onExecuteTask(Param... params);
  88.  
  89. /**
  90. * 发送进度更新到主线程
  91. *
  92. * @param update
  93. */
  94. public final void onPostUpdate(Update update) {
  95. Message.obtain();
  96. Message message = getDefaultPoster().obtainMessage();
  97. message.what = WHAT_UPDATE;
  98. message.obj = new Messager<Param, Update, Result>(this, update, null);
  99. message.sendToTarget();
  100. }
  101.  
  102. /**
  103. * 当返回进度更新的时候
  104. *
  105. * @param update
  106. */
  107. protected void onUpdate(Update update) {
  108. }
  109.  
  110. /**
  111. * 发送进度执行结果到主线程
  112. *
  113. * @param result
  114. */
  115. public final void onPostResult(Result result) {
  116. Message.obtain();
  117. Message message = getDefaultPoster().obtainMessage();
  118. message.what = WHAT_RESULT;
  119. message.obj = new Messager<Param, Update, Result>(this, null, result);
  120. message.sendToTarget();
  121. }
  122.  
  123. /**
  124. * 当返回执行结果的时候
  125. *
  126. * @param result
  127. */
  128. protected void onResult(Result result) {
  129.  
  130. }
  131.  
  132. private static class Messager<Param, Update, Result> {
  133.  
  134. private final MultiAsynctask<Param, Update, Result> asynctask;
  135.  
  136. private final Update update;
  137.  
  138. private final Result result;
  139.  
  140. public Messager(MultiAsynctask<Param, Update, Result> asynctask, Update update, Result result) {
  141. this.asynctask = asynctask;
  142. this.update = update;
  143. this.result = result;
  144. }
  145.  
  146. /**
  147. * 调用当前MultiAsynctask的主线程更新方法
  148. */
  149. public void onUpdate() {
  150. asynctask.onUpdate(update);
  151. }
  152.  
  153. /**
  154. * 调用当前MultiAsynctask的主线程结果方法
  155. */
  156. public void onResult() {
  157. asynctask.onResult(result);
  158. }
  159.  
  160. }
  161.  
  162. /**
  163. * <p>
  164. * 线程间通信使者
  165. * </p>
  166. * Created in Mar 27, 2016 10:00:03 PM.
  167. *
  168. * @author Yolanda;
  169. */
  170. private static class Poster extends Handler {
  171.  
  172. public Poster() {
  173. super(Looper.getMainLooper());
  174. }
  175.  
  176. @Override
  177. public void handleMessage(Message msg) {
  178. Messager<?, ?, ?> messageer = (Messager<?, ?, ?>) msg.obj;
  179. if (msg.what == WHAT_RESULT) {
  180. messageer.onResult();
  181. } else if (msg.what == WHAT_UPDATE) {
  182. messageer.onUpdate();
  183. }
  184. }
  185. }
  186.  
  187. /**
  188. * <p>
  189. * 任务执行器
  190. * </p>
  191. * Created in Mar 27, 2016 10:03:44 PM.
  192. *
  193. * @author Yolanda;
  194. */
  195. private class Tasker implements Runnable {
  196.  
  197. private Param[] params;
  198.  
  199. public Tasker(Param... params) {
  200. this.params = params;
  201. }
  202.  
  203. @Override
  204. public void run() {
  205. Result result = onExecuteTask(params);
  206. onPostResult(result);
  207. }
  208. }
  209.  
  210. }

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. linux定时任务执行没结果,手动执行有结果问题总结

    今天写了个脚本手动执行有结果,但是放到系统定时任务跑却没结果,之前也遇到这种问题解决了没记录后面又懵逼了一次~~~ 如下图: 手动执行有结果 放到定时任务中每五分钟执行一次 解决方法: 脚本中加载系统 ...

  2. skywalking部署

    官方文档:Setup java agent Backend and UI 下载地址:http://skywalking.apache.org/downloads/ 解压后目录 部署UI和收集器 进入w ...

  3. Unity3D热更新之LuaFramework篇[03]--prefab加载和Button事件

    在上一篇文章 Unity3D热更新之LuaFramework篇[02]--用Lua创建自己的面板 中,我介绍了LuaFramework加载面板的方法,但这个方法并不适用于其它Prefab资源,在这套框 ...

  4. gradle 自定义插件 下载配置文件

    1.新建Gradle项目: 2.建立src/main/groovy目录,并添加如下代码: ConfigPlugin.groovy package com.wemall.config import or ...

  5. MyBatis源码解析(一)——执行流程

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6603926.html 一.MyBatis简介 MyBatis框架是一种轻量级的ORM框架, ...

  6. 【学习笔记】node.js重构路由功能

    摘要:利用node.js模块化实现路由功能,将请求路径作为参数传递给一个route函数,这个函数会根据参数调用一个方法,最后输出浏览器响应内容 1.介绍 node.js是一个基于Chrome V8引擎 ...

  7. MySQL 索引与查询优化

    本文介绍一些优化 MySQL 索引设计和查询的建议.在进行优化工作前,请务必了解MySQL EXPLAIN命令: 查看执行计划 索引 索引在逻辑上是指从索引列(关键字)到数据的映射,通过索引可以快速的 ...

  8. MySQL/MariaDB表表达式(3):视图

    视图是表表达式的一种,所以它也是虚拟表.对视图操作的时候会通过语句动态的从表中临时获取数据. 1.创建.修改视图 CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED ...

  9. sharding:谁都能读懂的分库、分表、分区

    本文通过大量图片来分析和描述分库.分表以及数据库分区是怎样进行的. 1.sharding前的初始数据分布 在本文中,我打算用高考考生相关信息作为实验数据.请无视表的字段是否符合现实,也请无视表的设计是 ...

  10. KeepAlived(三):vrrp实例故障转移(keepalived+haproxy)

    keepalived使用脚本进行健康检查时的相关配置项.例如keepalived+haproxy实现haproxy的高可用. keepalived分为vrrp实例的心跳检查和后端服务的健康检查.如果要 ...