AsyncHttp
一款为android 网络请求的框架,采用最少的线程,基于AsyncPool 线程池实现的 http请求,支持 post和 get、delete等多种请求,实现请求任务和结果异步获取,支持初中高级开发人员各阶段的代码习惯。底层采用的是主线程管理工作线程的模式,并且维护了自己的请求队列,并且采取了任务的执行和结果的返回采取了不同的线程执行,所以更适用于批量网络请求
AsyncHttp 有哪些功能?
基本网络请求
文件下载(支持断点下载)
单线程下载
多线程下载
自定义头部请求信息
含有优先级,防止请求无反应
文件上传
使用方法
compile 'com.ml.asynchttp:asynchttp-android:1.0.7'
AsyncHttpUtils.init(new RequestInterceptorActionInterface() { @Override public <T> BaseHttpRequest<T> interceptorAction(BaseHttpRequest<T> baserequest) throws Exception { TelephonyManager tm = (TelephonyManager) BaseApplication.getInstance().getSystemService(Context.TELEPHONY_SERVICE); return baserequest; } }, new ResponseInterceptorActionInterface(){ ); LogUtils.setDebug(true);
参数1自定义请求处理拦截器,需要实现 RequestInterceptorActionInterface 接口
参数2是结果过滤器,可以自定义,只需要 实现 ResponseInterceptorActionInterface 接口
提示 : 请求拦截器和过滤器可以在框架初始化添加,也可以在创建请求的时候,添加到请求中
普通网络请求
##### 常规写法 String url=Contents.baseURL+"user/"+ machineid +"/getDutyList.do"; Log.e("PaiBanActivity",url); AsyncHttpUtils.json(url, HttpMethod.Post, new HashMap<String, String>(), new JsonRequestLoadingCallback<PaiBanBean>(this) { @Override public void requestFail(Exception e, ResponseBody<String> request) { e.printStackTrace(); showToast("网络出错,请重试"); } @Override public void requsetFinish() { } @Override public void requsetStart() { } @Override public void requestSuccess(PaiBanBean paiBanBean) { Log.e("PaiBanActivity",paiBanBean.toString() ); int status = paiBanBean.getStatus(); if (status==1) { setPaiBan(paiBanBean); }else { showToast("获取数据失败,请重试"); } } }); ##### 个性写法 ###### 步骤一:定义相关的接口 public interface PathBeanTest { @JSONPOST("http://{ip}.26.106.136:8080/rest/common/user/login.do") public CProxyRequester test(@PathParam("ip")String ip, @Param("username")String username, @Param("password")String passwork ); @GET("http://{ip}.26.106.136:8080/rest/common/allFactorys.do") public CProxyRequester getAll(@PathParam("ip")String ip); } *其中,方法注解包含有:JSONPOST POST GET DELETE PUT ....等 ,JSONPOST和POST无技术上差别,只是为了开发人员辨识清晰 *方法参数注解,包含两种,PathParam,Param ,PathParam表示匹配方法注解上的URL占位符,Param是请求的具体参数 ,注意: 例如上面的 {ip} 方法中@PathParam("ip")String ip 名称要对应 否则,请求失败 ###### 步骤二:通过代理实例化接口 PathBeanTest t= ProxyCreater.creator(PathBeanTest.class); ###### 步骤三:设置结果处理线程级别 t.getAll("120").ResultMonitor(MIO.MainThread).Observation(new StringRequestResultCallBack<FactoryTestBean>() { @Override public void requestFail(Exception e, ResponseBody<String> request) { } @Override public void requestSuccess(FactoryTestBean factoryTestBean) { Log.e("tag",factoryTestBean.getMsg()+" "+factoryTestBean.getData().getList().size()); } @Override public void requsetFinish() { } @Override public void requsetStart() { } }); ######MIO.MainThread表示主线程,MIO.IOThread 表示IO线程
文件的下载
写法一: String url="http://scimg.jb51.net/allimg/160815/103-160Q509544OC.jpg"; //必须设置存储路径 String filepath="C:\\Users\\admin\\Pictures\\Camera Roll\\img"+i+".jpg"; FileRequest resReques=new FileRequest(url); resReques.setFilepath(filepath); resReques.addHead(new Header("user-agent", "AsyHttp/1.0 ml")); resReques.setRequestMethod(HttpMethod.Get); TaskHandler taskhandler= AsyncHttp.instance().download(resReques, new FileTest()); //可以调用 taskhandler.stop()方法取消任务 //FileTest 是 继承了 DownProgrossCallback<ResponseBody<T>>的 回掉接口,实现进度的监控,和结果的返回 } 写法二: AsyncHttpUtils.download("http://pic1.sc.chinaz.com/files/pic/pic9/201611/apic24088.jpg", "/sdcard/test/", "file.jpg", new DownProgrossCallback<ResponseBody<File>>() { @Override public void download_current(long current, long total) { Log.e("tag", "current=" + current + " total=" + total); int pr = (int) (current * 100.0 / total); xiazai_pr.setProgress(pr); } @Override public void start() { Toast.makeText(getApplication(), "开始下载", Toast.LENGTH_SHORT).show(); } @Override public void finish() { Toast.makeText(getApplication(), "完成", Toast.LENGTH_SHORT).show(); } @Override public void success(ResponseBody<File> result) { Toast.makeText(getApplication(), "成功下载" + result.getResult().getPath(), Toast.LENGTH_SHORT).show(); } @Override public void fail(Exception e, ResponseBody<File> request) { e.printStackTrace(); Toast.makeText(getApplication(), e.getMessage(), Toast.LENGTH_SHORT).show(); } }); 写法三: public interface DownloadTest { @DOWNLOAD("http://pic6.nipic.com/20100426/1687102_082357914928_2.jpg") public CProxyRequester<File> down(@Param String path); } DownloadTest downloadTest=ProxyCreater.creator(DownloadTest.class); downloadTest.down("/sdcard/test/file2.jpg").ResultMonitor(MIO.MainThread).Observation(new DownProgrossCallback<ResponseBody<File>>() { @Override public void download_current(long current, long total) { } @Override public void start() { } @Override public void finish() { } @Override public void success(ResponseBody<File> result) { } @Override public void fail(Exception e, ResponseBody request) { } });
多线程下载文件
String urls="http://img.taopic.com/uploads/allimg/130711/318756-130G1222R317.jpg"; String name=urls.substring(urls.lastIndexOf("/")+1,urls.length()); String filepath="C:\\Users\\admin\\Pictures\\Camera Roll\\"+name; download s= new download(new RecordEntity(urls,filepath)); s.setTaskPriority(TaskPriority.LOWEST.getValue());//设置优先级 TaskHandler t= AsyncHttp.instance().download(s, new DownProgrossCallback<ResponseBody<RandomAccessFile>>() { @Override public void download_current(long current, long total) { // TODO Auto-generated method stub // System.out.println("当前 "+e+" current=="+current+" total="+total); } @Override public void fail(Exception e1,ResponseBody<RandomAccessFile> response) { // TODO Auto-generated method stub super.fail(e1,response); System.out.println("任务 "+ e+" ="+ Utils.getNowTime()+" e1="+e1.getMessage()); } @Override public void start() { // TODO Auto-generated method stub super.start(); System.out.println("任务 "+ e+" startTime="+ Utils.getNowTime()); } @Override public void finish() { // TODO Auto-generated method stub super.finish(); System.out.println("任务 "+ e+" endTime="+ Utils.getNowTime()); } });
上传文件 (单线程)
#####一般写法1 String url="http://192.168.1.33:8080/StrutsDemo2/upload.action"; UploadRequest resReques=new UploadRequest(url); resReques.addParam(new FileParamPart("upload", new File("C:\\Users\\admin\\Pictures\\Camera Roll\\img10.jpg"),Constents.TYPE_IMAGE)); resReques.setRequestMethod(HttpMethod.Post); AsyncHttp.instance().newRequest2(resReques, new uploadTest()); //uploadTest是 继承了 UploadProgrossCallback<ResponseBody<T>>的 回掉接口,实现进度的监控,和结果的返回 #####一般写法2 AsyncHttpUtils.upload("http://120.26.106.136:8080/rest/common/user/uploadAvatar.do", "/sdcard/test/test.jpg", "file", new UploadProgrossCallback<ResponseBody<String>>() { @Override public void upload_current(long current, long currentFileTotal, long total) { int pr = (int) (current * 100.0 / total); Log.e("tag", "current=" + current + " currentFileTotal= " + currentFileTotal + " total=" + total); progressBar_shangchuan.setProgress(pr); } @Override public void start() { Toast.makeText(getApplication(), "开始上传", Toast.LENGTH_SHORT).show(); } @Override public void finish() { Toast.makeText(getApplication(), "完成", Toast.LENGTH_SHORT).show(); } @Override public void success(ResponseBody<String> result) { Log.e("tag", result.getResult()); } @Override public void fail(Exception e, ResponseBody<String> request) { Toast.makeText(getApplication(), e.getMessage(), Toast.LENGTH_SHORT).show(); e.printStackTrace(); Log.e("tag", request.getResult()); } }); #####个性写法 public interface UploadTest { @UPLOAD("http://120.26.106.136:8080/rest/common/user/uploadFile.do") public CProxyRequester<UploadResultBean> upload(@Param("file") String filepath); } UploadTest uploadTest= ProxyCreater.creator(UploadTest.class); uploadTest.upload("/sdcard/test/file.jpg").ResultMonitor(MIO.MainThread).Observation(new UploadRequestResultCallBack<UploadResultBean>(){ @Override public void upload_current(long current, long currentFileTotal, long total) { int pr = (int) (current * 100.0 / total); Log.e("tag", "current=" + current + " currentFileTotal= " + currentFileTotal + " total=" + total); progressBar_shangchuan.setProgress(pr); } @Override public void requestFail(Exception e, ResponseBody<String> request) { e.printStackTrace(); } @Override public void requestSuccess(UploadResultBean uploadResultBean) { Log.e("tag",uploadResultBean.getMsg()); Toast.makeText(getApplicationContext(),uploadResultBean.getData().getName(),Toast.LENGTH_LONG).show(); } @Override public void requsetFinish() { } @Override public void requsetStart() { } });
有问题反馈
在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流
邮件:menglei0207@sina.cn
作者其他开源
原文:http://blog.csdn.net/yanbober/article/details/45307549 开源项目链接 Android-async-http仓库:Git clone https://github.com/loopj/android-async-http android-async-http主页:http://loopj.com/android-async-http/ 背景
最近做的项目中由于其他两个安卓开发成员都是用AsyncHttp用的比较熟练,就选用了AsyncHttp作为网络框架。。然后坑就来了 由于要做一个带进度条的下载任务,所以用到了BinaryHttpResponseHandler ,结果一直报Content-Type(..)not allowed!的错误,然后找了下才发现是设置mAllowedContentTypes 这个参数的错误,要看上面(..)的
一.什么是安卓async-http async-http是用于请求网络的工具,是一个第三方的网络插件,可以方便访问网络。 二.如何使用async-http 1.首先添加依赖包,下载第三方插件 compile 'com.loopj.android:android-async-http:1.4.9' 2.然后创建类写访问网络方法 package com.example.ll.king; impor
本文是Yoshua Wuyts大佬博客关于async http文章的大部分内容的翻译。原文地址https://blog.yoshuawuyts.com/async-http/ Friedel Ziegelmayer、Ryan Levick和我向大家强力推荐一组http库,有了他们就可以轻松快速地开发加密的异步http/1.1服务器端和客户端。它们是 async-h1 – 支持streaming的H
这种是可以自定义post的参数的格式的,一般使用json,详情请见(http://stackoverflow.com/questions/26842090/asynchttpclient-passed-contenttype-will-be-ignored-because-httpentity-sets-cont)举例说明 AsyncHttpClient clien
尝试在asyncTask里的doInBackground方法中执行asyncHttp请求的时候会报如下异常:Caused by: java.lang.IllegalArgumentException: Synchronous ResponseHandler used in AsyncHttpClient. You should create your response handler in a l
let router = new Router(); router.get('/info', async(ctx) => { let result = await request.get('http://api/xxxx'); ctx.body = result; }); 这样是可以在 /info 页面上获取到request返回值的,但是如何对其内部进行操作?我使用console.log(resu
await/async await await后必须接一个可等待对象(awaitable object),可等待对象有3类:协程coroutine、任务Task、未来对象Future。 async async用来修饰函数,被async修饰的函数返回一个协程对象。直接调用async函数不会执行函数,可以用await或asyncio.run等方式来真正执行async函数。 import asyncio
Mpx提供了网络请求库fetch,抹平了微信,阿里等平台请求参数及响应数据的差异;同时支持请求拦截器,请求取消等 使用说明 import mpx from '@mpxjs/core' import mpxFetch from '@mpxjs/fetch' mpx.use(mpxFetch) // 第一种访问形式 mpx.xfetch.fetch({ url: 'http://xxx.com' }
本文向大家介绍Flutter 网络请求框架封装详解,包括了Flutter 网络请求框架封装详解的使用技巧和注意事项,需要的朋友参考一下 Flutter 请求网络的三种方式 flutter 请求网络的方式有三种,分别是 Dart 原生的网络请求 HttpClient、第三方网络请求 http以及 Flutter 中的 Dio。我们可以比较一下这三种网络请求方式,然后封装为我们方便请求网络的工具类。
类似于Ajax,QAP实现了Fetch功能,能够简单的异步的获取资源。 GET QN.fetch('http://121.42.141.44:8888', { body: '', method: 'GET', mode: 'same-origin', dataType: 'text', }) .then(response => { return respon
request 指的是小程序中的网络请求,在 mpvue 框架中可以通过小程序提供的原生 API wx.request 来进行相关的处理。但是在这里推荐一个第三方的网络请求库 fly。之所以推荐这个第三方库,是因为可以在多个端上实现代码的复用,目前已支持的有 Node.js 、微信小程序 、Weex 、React Native 、Quick App。 在 mpvue 中如何使用 安装 npm in
Chrome提供了较为完整的方法供扩展程序分析、阻断及更改网络请求,同时也提供了一系列较为全面的监听事件以监听整个网络请求生命周期的各个阶段。网络请求的整个生命周期所触发事件的时间顺序如下图所示。 网络请求的生命周期,图片来自developer.chrome.com 要对网络请求进行操作,需要在Manifest中声明webRequest权限以及相关被操作的URL。如需要阻止网络请求,需要声明web
BaaS 提供 wx.BaaS.request(OBJECT) 接口用于调用 API。 wx.BaaS.request() 相比 wx.request() 的优势: 支持 Promise 规范 方便 BaaS 分析接口调用状况 无需关心微信 wx.request() 方法是否更新 自动配置必要的参数 OBJECT 参数说明 参数 类型 必填 说明 url String 是 接口地址 method
本文向大家介绍Android最基本的异步网络请求框架,包括了Android最基本的异步网络请求框架的使用技巧和注意事项,需要的朋友参考一下 本篇文章我们来一起写一个最基本的Android异步网络请求框架,借此来了解下Android中网络请求的相关知识。由于个人水平有限,文中难免存在疏忽和谬误,希望大家可以指出,谢谢大家。 1. 同步网络请求 以HTTP的GET请求为例,我们来介绍一下An
假设我在同一台机器上有两个docker网络。(网络1和网络2) 在每个网络上,我都有容器。(容器-1-网络-1和容器-1-网络-2等) 我需要从Container-1(172.18.0. x)向Container-2(172.19.0. x)发送PUT请求,但我收到“连接拒绝”,因为不同的网络无法相互通信。我在这里有什么选择?我可以将一个容器移动到另一个网络,或将网络合并到一个或以某种方式链接容器