NoHttp封装--07 自定义异步任务框架

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 == 200) {
17                 int len = 0;
18                 byte[] buffer = new byte[1024];
19                 ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
20                 InputStream inputStream = new BufferedInputStream(connection.getInputStream());
21                 while ((len = inputStream.read(buffer)) != -1) {
22                     arrayOutputStream.write(buffer, 0, 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 = 5;
 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 }

原文地址:https://www.cnblogs.com/ganchuanpu/p/9038801.html

时间: 2024-10-13 22:35:03

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

自定义异步IO框架

异步就是回调 异步 = 非阻塞+循环 select只能完成IO多路复用,不能完成异步 IO多路复用--->监听多个socket对象,这个过程是同步的 利用其特性可以开发异步模块 异步IO:非阻塞的socket + IO多路复用 自定义异步框架 import socket import select class HttpRequest(object): def __init__(self, sk, host, callback): self.socket = sk self.host = host

自定义异步IO模块开发

响应头和响应体是用两个换行分割的 sk.setblock(False) 不阻塞 host是IP  比如www.baidu.com也是host,IP地址也是 r,w,e=select.select() w是连接成功的socket对象 r是有数据返回的socket对象 IO多路复用:r,w,e=while 监听多个socket对象 异步IO:非阻塞的socket+IO多路复用 -非阻塞socket -select[自己对象],w,r 异步IO模块本身是一个线程同步,使用者是异步的 import so

Android异步处理框架AsyncTask源码解析

一.概述 在Android开发中,我们进行异步处理一般会采用两种方式: 1.Thread +Handler 通常我们在Thread里面发送消息,然后在Handler的handleMessage方法里面去处理对应的任务,因为Android是不允许UI线程去更新UI的,这个时候我们可以采取这种方式 2.AsyncTask AsyncTask是Android为我们封装的一个轻量级的异步处理框架,其实底层也是用了类似Thread+Handler的方式.对外提供了一些方法,我们实现这些方法就可以很方便的进

Android异步任务处理框架AsyncTask源码分析

[转载请注明出处:http://blog.csdn.net/feiduclear_up CSDN 废墟的树] 引言 在平时项目开发中难免会遇到异步耗时的任务(比如最常见的网络请求).遇到这种问题,我们可以自己通过Handler+Message+Thread/ThreadPool来构造一个异步耗时任务框架.当你下次项目中又遇到一个网络请求,你又不得不重写异步耗时任务处理框架.出于避免开发者重复搬砖工作,Google工程师给开发者搭建了一个通用的异步耗时任务处理框架--AsyncTask. Asyn

030.自定义的MVC框架

.LOG自定义的MVC框架 M: Model模型V: View 视图C: Controller 控制器 ASP.Net 1. Web窗体编程2. Mvc编程 IHttpHandler任何处理web请求的类必须实现此接口void ProcessRequest(HttpContext context)bool IsReuseable{get;} 使用IHttpHandler实现登录与注册1.新建UserHandelr:IHttpHandler接口2.web.config配置,处理 /user.do请

Voovan 是一个高性能异步网络框架和 HTTP(Java)

Voovan 是一个高性能异步网络框架和 HTTP 服务器框架,同时支持 HTTP 客户端抓取.动态编译支持.数据库访问封装以及 DateTime.String.Log.反射.对象工具.流操作.文件操作.异步双向通道等功能.旨在提供可靠.方便.可单元测试的代码.它是一个无任何依赖的独立工具包,希望能够方便广大开发者快速的实现应用. 作者:@愚民日记 地址:http://git.oschina.net/helyho/Voovan http://www.oschina.net/news/80909/

Python 开源异步并发框架的未来(转)

Python 开源异步并发框架的未来 fantix 1.1k 2014年04月16日 发布 推荐 4 推荐 收藏 31 收藏,8.9k 浏览 呵呵,这个标题有点大,其实只是想从零开始介绍一下异步的基础,以及 Python 开源异步并发框架的发展和互操作性. 另外,这是我在 OSTC 2014 做的一个 20140330-OSTC-分论坛1王川 http://v.youku.com/v_show/id_XNjk2ODI0ODQ4.html ,幻灯片在这里,欢迎拍砖. 开源 Python 是开源的,

Java异步NIO框架Netty实现高性能高并发

1. 背景 1.1. 惊人的性能数据 近期一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用.相比于传统基于Java序列化+BIO(同步堵塞IO)的通信框架.性能提升了8倍多. 其实,我对这个数据并不感到吃惊,依据我5年多的NIO编程经验.通过选择合适的NIO框架,加上高性能的压缩二进制编解码技术,精心的设计Reactor线程模型,达到上述性能指标是全然有可能的. 以下我们就一起来看下Ne

Python开源异步并发框架

Python开源异步并发框架的未来 2014年3月30日,由全球最大的中文IT社区CSDN主办的“开源技术大会·2014” (Open Source Technology Conference 2014,简称OSTC 2014)在北京丽亭华苑酒店召开. 本次大会以“启蒙·开源”(Open Mind, Open Source)为主题,邀请到了来自全国各地的30多位开源业界资深人士发表主题演讲,数十个开源社区现场参与,到场的开源软件开发者.贡献者和开源爱好 者总人数超过500人.作为一场“接地气”的