自定义网络框架之json文本请求
来源:互联网 发布:无人驾驶数据标注 编辑:程序博客网 时间:2024/06/06 01:10
自定义网络框架开发,功能:
支持请求: json文本类型音频,视频,图片类型,批量下载,上传
请求各种数据时,调用层不关心上船参数分装,如(request.addParameters(key,value)),直接将参数分装成对象传给狂框架,获取数据后,调用层不关心json数据解析
回调时,调用层只需知道传入的json对应的响应类。
回调响应结果发生在主线程(线程切换)
对下载,上传扩展
支持高并发请求,请求队列依次获取,可以设置最大并发数,设置先请求先执行
涉及的知识点:
- 泛型
- 请求队列
- 阻塞队列
- 线程池拒绝策略
设计模式:
- 模板方法模式
- 单例模式
- 策略模式
- 生产者消费者模式
使用的jar包: - fastjson(com.alibaba:fastjson:1.2.23)
- httpcore(httpcomponents-httpcore:httpcore:4.0-alpha6)
下面为json文本请求主要代码和思路
首先设计科三个接口分别为请求网络(IHttpService)网络访问结果回调(IHttpListener)和回调结果给调用层的接口(IDataListener)
public interface IDataListener <M>{ //回调结果给调用层 void onSuccess(M m); void onFail();}public interface IHttpListener { //网络访问处理结果回调 void onSuccess(HttpEntity httpEntity); void onFail();}public interface IHttpService { /* * 设置url * */ void setUrl(String url); //执行获取网络 void execute(); //设置处理接口 void setHttpListener(IHttpListener httpListener); //设置请求参数 void setRequestParameter( byte[] requestParameter);}
然后主要是接口的实现
IHttpService接口的实现JsonHttpService,主要利用HttpPost(引入的jar包)完成数据请求,并把请求成功的数据传递给IHttpListener的实现类JsonDealListener
public class JsonHttpService implements IHttpService { private IHttpListener httpListener; private HttpClient httpClient=new DefaultHttpClient(); private HttpPost httpPost; private String url; private byte[] requestParameter; private HttpRespnceHandler httpRespnceHandler=new HttpRespnceHandler(); @Override public void setUrl(String url) { this.url=url; } @Override public void execute() { httpPost=new HttpPost(url); ByteArrayEntity byteArrayEntity=new ByteArrayEntity(requestParameter); httpPost.setEntity(byteArrayEntity); try{ httpClient.execute(httpPost,httpRespnceHandler); }catch (IOException e){ httpListener.onFail(); } } @Override public void setHttpListener(IHttpListener httpListener) { this.httpListener=httpListener; } @Override public void setRequestParameter(byte[] requestParameter) { this.requestParameter=requestParameter; } private class HttpRespnceHandler extends BasicResponseHandler { @Override public String handleResponse(HttpResponse response)throws ClientProtocolException { //响应码 int code=response.getStatusLine().getStatusCode(); //200响应成功,传递请求成功的返回数据 if (code==200){ httpListener.onSuccess(response.getEntity()); } else { httpListener.onFail(); } return null; } }}
IHttpListener的实现类JsonDealListener主要完成将起请求成功的结果传递给调用层(IDataListener的实现者)
public class JsonDealListener<M> implements IHttpListener { private Class<M> responceClass; private IDataListener<M> dataListener; /** * 获取主线程的handler通过handler *切换至主线程 * */ Handler handler=new Handler(Looper.getMainLooper()); public JsonDealListener(Class<M> responceClass, IDataListener<M> dataListener){ this.responceClass=responceClass; this.dataListener=dataListener; } @Override public void onSuccess(HttpEntity httpEntity) { InputStream inputStream=null; try { inputStream = httpEntity.getContent(); String content = getContent(inputStream); final M responce = JSON.parseObject(content, responceClass); handler.post(new Runnable() { @Override public void run() { dataListener.onSuccess(responce); } }); }catch (IOException e){ dataListener.onFail(); } } @Override public void onFail() { dataListener.onFail(); } private String getContent(InputStream inputStream) { String content = null; try { BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } } catch (IOException e) { System.out.println("Error=" + e.toString()); dataListener.onFail(); } finally { try { inputStream.close(); } catch (IOException e) { System.out.println("Error=" + e.toString()); } } return sb.toString(); }catch (Exception e){ e.printStackTrace(); dataListener.onFail(); } return content; }}
我们将监听,请求服务,url等封装在ReqestHolder类
public class RequestHolder<T> { //执行下载类 private IHttpService httpService; //获取数据回调结果的类 private IHttpListener httpListener; //i请求参数对应的实体 private T requestInfo; private String url; public IHttpService getHttpService() { return httpService; } public void setHttpService(IHttpService httpService) { this.httpService = httpService; } public IHttpListener getHttpListener() { return httpListener; } public void setHttpListener(IHttpListener httpListener) { this.httpListener = httpListener; } public T getRequestInfo() { return requestInfo; } public void setRequestInfo(T requestInfo) { this.requestInfo = requestInfo; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; }}
我们将封装的实体类RequestHolder传递给ThreadPoolManager,ThreadPoolManager是我们对请求的优化,主要利用了线程池(ThreadPoolExecutor)和阻塞队列(LinkedBlockingQueue)来保存我们开启的线程,当阻塞队列没有任务时,线程池会阻塞等待,直到阻塞队列填充任务
public class ThreadPoolManager { private static final String TAG="gjh"; private static ThreadPoolManager instance=new ThreadPoolManager(); //生产者消费者模式 private LinkedBlockingQueue<Future<?>> taskQueue=new LinkedBlockingQueue<>(); private ThreadPoolExecutor threadPoolExecutor; public static ThreadPoolManager getInstance(){ return instance; } private ThreadPoolManager(){ /* * 参数一核心线程数 * 二 最大线程数 * 三 完成任务后空闲时间 * 四 空闲时间单位秒 * 五 阻塞队列 * 六 拒绝策略 * */ threadPoolExecutor=new ThreadPoolExecutor(4,10,10, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(4),handler); threadPoolExecutor.execute(runnable); } private Runnable runnable=new Runnable() { @Override public void run() { while(true){ FutureTask futureTask=null; try{ //阻塞式函数 Log.i(TAG,"等待队列"+taskQueue.size()); //取出任务后如果线程池已满将会执行拒绝策略从新放入taskQueue队列 futureTask= (FutureTask) taskQueue.take(); } catch (InterruptedException e) { e.printStackTrace(); } if (futureTask!=null){ threadPoolExecutor.execute(futureTask); } Log.i(TAG,"线程池大小 "+threadPoolExecutor.getPoolSize()); } } }; public <T> void execte(FutureTask<T> futureTask) throws InterruptedException { taskQueue.put(futureTask); } private RejectedExecutionHandler handler=new RejectedExecutionHandler(){ @Override public void rejectedExecution(Runnable runnable, ThreadPoolExecutor threadPoolExecutor) { try { taskQueue.put(new FutureTask<Object>(runnable,null)); } catch (InterruptedException e) { e.printStackTrace(); } } };}
然后我们写了Vooley类暴露出外部调用的方法,隐藏了具体的实现
public class Volley { //暴露给调用层 public static <T,M> void sendRequest(T requestInfo, String url, Class<M> response, IDataListener dataListener){ RequestHolder<T> requestHolder=new RequestHolder<>(); requestHolder.setUrl(url); IHttpService httpService=new JsonHttpService(); requestHolder.setRequestInfo(requestInfo); IHttpListener httpListener=new JsonDealListener<>(response,dataListener); requestHolder.setHttpListener(httpListener); requestHolder.setHttpService(httpService); HttpTask<T> httpTask=new HttpTask<>(requestHolder); try { ThreadPoolManager.getInstance().execte(new FutureTask<Object>(httpTask,null)); } catch (InterruptedException e) { e.printStackTrace(); } }}
测试类:
public class LoginResponse { private int code; private String user_id; private String time; private String name; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getUser_id() { return user_id; } public void setUser_id(String user_id) { this.user_id = user_id; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getName() { return name; } public void setName(String name) { this.name = name; }}public class User { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}public class MainActivity extends AppCompatActivity { public static final String url=""; private static final String Tag="gjh"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void login (View view){ User user=new User(); user.setName("dd"); user.setPassword("sss"); for (int i=0;i<50;i++){ Volley.sendRequest(user, url, LoginResponse.class, new IDataListener<LoginResponse>() { @Override public void onSuccess(LoginResponse loginResponse) { Log.i(Tag,loginResponse.toString()); } @Override public void onFail() { Log.i(Tag,"请求失败"); } }); } }}
- 自定义网络框架之json文本请求
- Android自定义框架之网络请求
- Android自定义框架之网络请求 .
- 网络请求框架(二):volley使用之自定义请求
- volley框架之json请求
- Xutils框架之网络请求
- Ajax请求json文本
- 自定义网络框架之下载
- Android okHttp网络请求之Json解析
- Swift之网络请求框架封装
- Android网络请求框架之Retrofit(一)
- Android网络请求框架之Retrofit(二)
- Android网络请求框架之Retrofit(三)
- android开发之网络请求框架比较
- Android网络请求框架之Retrofit实践
- Android 网络请求框架之Rxjava+Retrofit
- Android 网络请求框架之Rxjava+Retrofit
- Android 网络请求框架之Rxjava+Retrofit
- 游戏:数字对对碰
- Servlet分页技术
- 51Nod 1183 编辑距离
- 使用PHP生成二维码的两种方法(带logo图像)
- 【BZOJ2175】旅游(树链剖分,Link-Cut Tree)
- 自定义网络框架之json文本请求
- JVM体系结构认知
- HDU 1005 找规律
- 【学习笔记】oracle11g multi column statistics深入研究笔记
- Joda与Jdk1.8日期知多少
- C语言的关键字
- 平衡二叉树,AVL树之图解篇
- leetcode解题方案--032--Longest Valid Parentheses
- 使用construct 2做进阶游戏