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的一个重要特性便是 ...
随机推荐
- 整理+学习《骆昊-Java面试题全集(中)》
这部分主要是与Java Web和Web Service相关的面试题. 96.阐述Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行 ...
- python通过snmp协议运用多线程获取多台主机网卡信息,写入数据库
#-*- coding:utf-8 -*- import netsnmp class SnmpClass(object): """ SNMP ""&q ...
- threadid=1: thread exiting with uncaught exception (group=0x40fca9a8)的问题
今天在项目开发中碰到了这样一个问题: 项目在Nexus5[Android 6.0]上面运行正常,在华为荣耀6[Android 4.4.2]上面运行到指定activity崩溃(不是应用启动崩溃):然后后 ...
- 在ASP.NET Core 2.2 中创建 Web API并结合Swagger
一.创建 ASP.NET Core WebApi项目 二.添加 三. ----------------------------------------------------------- 一.创建项 ...
- zookeeper服务发现实战及原理--spring-cloud-zookeeper源码分析
1.为什么要服务发现? 服务实例的网络位置都是动态分配的.由于扩展.失败和升级,服务实例会经常动态改变,因此,客户端代码需要使用更加复杂的服务发现机制. 2.常见的服务发现开源组件 etcd—用于共享 ...
- SpringBoot(10) Servlet3.0的注解:自定义原生Servlet、自定义原生Listener
一.自定义原生Servlet 1.启动类里面增加注解 @ServletComponentScan 2.Servlet上添加注解 @WebServlet(name = "userServle ...
- μC/OS-II 任务就绪表及任务调度
任务调度 多任务操作系统的核心工作就是任务调度. 所谓调度,就是通过一个算法在多个任务中确定该运行的任务,做这项工作的函数就叫做调度器. μC/OS-II 进行任务调度的思想是 "近似地每时 ...
- Python系列:三、流程控制循环语句--技术流ken
Python条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和非 ...
- SpringBoot学习(四)-->SpringBoot快速入门,开山篇
Spring Boot简介 Spring Boot的目的在于创建和启动新的基于Spring框架的项目.Spring Boot会选择最适合的Spring子项目和第三方开源库进行整合.大部分Spring ...
- [转]laravel DB类SQL语句操作(CURD)
本文转自:https://blog.csdn.net/woshihaiyong168/article/details/52992812 版权声明:本文为勇哥原创文章,转载请注明出处哦!!! https ...