android+网络下载资源,最好的安卓网络请求库: Fast Android Networking

01557bfff9287cf4329f012e18d55647.png

最近我发布了一个library,我认为它是安卓上处理网络的最简方式。

每个请求都可以轻易的定制OkHttpClient-比如超时等。

支持把JSON解析成java对象(同时支持Jackson解析)。

可以得到任何请求的详细数据分析。你可以知道发送了多少字节,接收了多少字节,以及请求所花的时间。这些数据是很重要的,这样你就可以识别出慢的请求。

你可以得到当前的带宽和网络质量以写出更合理的代码-网络质量高的时候下载高质量的图片,不好的时候下载低质量的图片。

Proper Response Caching— which leads toreduced bandwidth usage.

很好的响应请求-可以减少带宽的使用。

一个executor可以被传递给任何请求让响应在另一个线程中被获取。如果你在响应中做了很重的任务,你不可以在主线程中做。

一个库就能处理所有类型的网络问题-下载,上传,multipart。

可以通过设置prefetch(预取)让请求在需要的时候立即返回缓存。

任何类型的自定义都是可以的

立即请求真的是立即发生的。

很好的取消请求。

如果一个请求完成了指定的百分比,可以阻止其取消。

一个简单的接口就可以做任何类型的请求。

最近Android Marshmallow(Android M)上对HttpClient的移除让其它的网络库都过时了。

没有哪个单一的库做完了所有的事情,比如发送请求,下载任意类型的文件,上传文件,在ImageView中加载网络图片,等等。有一些库可以但是都过时了。

因为使用了sOkHttp,所以支持HTTP/2。

没有哪个库为网络中所有类型的事情提供了简单的接口,比如设置优先级,取消请求等。

build.gradlecompile 'com.amitshekhar.android:android-networking:0.2.0'

如果和RxJava一起使用compile 'com.amitshekhar.android:rx-android-networking:0.1.0'

如果和Jackson Parser一起使用compile 'com.amitshekhar.android:jackson-android-networking:0.2.0'

别忘了加网络权限

然后在application类的onCreate()方法中做初始化:AndroidNetworking.initialize(getApplicationContext());

发起GET请求AndroidNetworking.get("http://api.localhost.com/{pageNumber}/test")

.addPathParameter("pageNumber", "0")

.addQueryParameter("limit", "3")

.addHeaders("token", "1234")

.setTag("test")

.setPriority(Priority.LOW)

.build()

.getAsJSONArray(new JSONArrayRequestListener() {

@Override

public void onResponse(JSONArray response) {

// do anything with response

}

@Override

public void onError(ANError error) {

// handle error

}

});

发起POST请求AndroidNetworking.post("http://api.localhost.com/createAnUser")

.addBodyParameter("firstname", "Amit")

.addBodyParameter("lastname", "Shekhar")

.setTag("test")

.setPriority(Priority.MEDIUM)

.build()

.getAsJSONArray(new JSONArrayRequestListener() {

@Override

public void onResponse(JSONArray response) {

// do anything with response

}

@Override

public void onError(ANError error) {

// handle error

}

});

和JAVA对象一起使用 - JSON Parser/*--------------Example One -> Getting the userList----------------*/

AndroidNetworking.get("http://api.localhost.com/getAllUsers/{pageNumber}")

.addPathParameter("pageNumber", "0")

.addQueryParameter("limit", "3")

.setTag(this)

.setPriority(Priority.LOW)

.build()

.getAsParsed(new TypeToken>() {}, new ParsedRequestListener>() {

@Override

public void onResponse(List users) {

// do anything with response

Log.d(TAG, "userList size : " + users.size());

for (User user : users) {

Log.d(TAG, "id : " + user.id);

Log.d(TAG, "firstname : " + user.firstname);

Log.d(TAG, "lastname : " + user.lastname);

}

}

@Override

public void onError(ANError anError) {

// handle error

}

});

/*--------------Example Two -> Getting an user----------------*/

AndroidNetworking.get("http://api.localhost.com/getAnUser/{userId}")

.addPathParameter("userId", "1")

.setTag(this)

.setPriority(Priority.LOW)

.build()

.getAsParsed(new TypeToken() {}, new ParsedRequestListener() {

@Override

public void onResponse(User user) {

// do anything with response

Log.d(TAG, "id : " + user.id);

Log.d(TAG, "firstname : " + user.firstname);

Log.d(TAG, "lastname : " + user.lastname);

}

@Override

public void onError(ANError anError) {

// handle error

}

});

/*-- Note : TypeToken and getAsParsed is important here --*/

从服务器下载一个文件AndroidNetworking.download(url,dirPath,fileName)

.setTag("downloadTest")

.setPriority(Priority.MEDIUM)

.build()

.setDownloadProgressListener(new DownloadProgressListener() {

@Override

public void onProgress(long bytesDownloaded, long totalBytes) {

// do anything with progress

}

})

.startDownload(new DownloadListener() {

@Override

public void onDownloadComplete() {

// do anything after completion

}

@Override

public void onError(ANError error) {

// handle error

}

});

上传一个文件AndroidNetworking.upload(url)

.addMultipartFile("image",file)

.setTag("uploadTest")

.setPriority(Priority.IMMEDIATE)

.build()

.setUploadProgressListener(new UploadProgressListener() {

@Override

public void onProgress(long bytesUploaded, long totalBytes) {

// do anything with progress

}

})

.getAsJSONObject(new JSONObjectRequestListener() {

@Override

public void onResponse(JSONObject response) {

// do anything with response

}

@Override

public void onError(ANError error) {

// handle error

}

});

得到一个响应并在另一个线程executor中完成

(注 : 错误和进度总是在主线程中返回)AndroidNetworking.upload(url)

.addMultipartFile("image",file)

.setTag("uploadTest")

.setPriority(Priority.IMMEDIATE)

.build()

.setExecutor(Executors.newSingleThreadExecutor()) // setting an executor to get response or completion on that executor thread

.setUploadProgressListener(new UploadProgressListener() {

@Override

public void onProgress(long bytesUploaded, long totalBytes) {

// do anything with progress

}

})

.getAsJSONObject(new JSONObjectRequestListener() {

@Override

public void onResponse(JSONObject response) {

// below code will be executed in the executor provided

// do anything with response

}

@Override

public void onError(ANError error) {

// handle error

}

});

取消一个请求

任何一个指定了tag的请求都可以被取消。AndroidNetworking.cancel("tag");

把从网络加载的图片放到ImageView

android:id="@+id/imageView"

android:layout_width="100dp"

android:layout_height="100dp"

android:layout_gravity="center" />

imageView.setDefaultImageResId(R.drawable.default);

imageView.setErrorImageResId(R.drawable.error);

imageView.setImageUrl(imageUrl);

从url获取指定了一些参数的BitmapAndroidNetworking.get(imageUrl)

.setTag("imageRequestTag")

.setPriority(Priority.MEDIUM)

.setBitmapMaxHeight(100)

.setBitmapMaxWidth(100)

.setBitmapConfig(Bitmap.Config.ARGB_8888)

.build()

.getAsBitmap(new BitmapRequestListener() {

@Override

public void onResponse(Bitmap bitmap) {

// do anything with bitmap

}

@Override

public void onError(ANError error) {

// handle error

}

});

Prefetch a request (so that it can return from cache when required at instant)AndroidNetworking.get(ApiEndPoint.BASE_URL + ApiEndPoint.GET_JSON_ARRAY)

.addPathParameter("pageNumber", "0")

.addQueryParameter("limit", "30")

.setTag(this)

.setPriority(Priority.LOW)

.build()

.prefetch();

为某个请求自定义OkHttpClientOkHttpClient okHttpClient = new OkHttpClient().newBuilder()

.addInterceptor(new GzipRequestInterceptor())

.build();

AndroidNetworking.get("http://api.localhost.com/{pageNumber}/test")

.addPathParameter("pageNumber", "0")

.addQueryParameter("limit", "3")

.addHeaders("token", "1234")

.setTag("test")

.setPriority(Priority.LOW)

.setOkHttpClient(okHttpClient) // passing a custom okHttpClient

.build()

.getAsJSONArray(new JSONArrayRequestListener() {

@Override

public void onResponse(JSONArray response) {

// do anything with response

}

@Override

public void onError(ANError error) {

// handle error

}

});

用ConnectionClass Listener得到当前网络质量和带宽// Adding Listener

AndroidNetworking.setConnectionQualityChangeListener(new ConnectionQualityChangeListener() {

@Override

public void onChange(ConnectionQuality currentConnectionQuality, int currentBandwidth) {

// do something on change in connectionQuality

}

});

// Removing Listener

AndroidNetworking.removeConnectionQualityChangeListener();

// Getting current ConnectionQuality

ConnectionQuality connectionQuality = AndroidNetworking.getCurrentConnectionQuality();

if(connectionQuality == ConnectionQuality.EXCELLENT){

// do something

}else if (connectionQuality == ConnectionQuality.POOR){

// do something

}else if (connectionQuality == ConnectionQuality.UNKNOWN){

// do something

}

// Getting current bandwidth

int currentBandwidth = AndroidNetworking.getCurrentBandwidth(); // Note : if (currentBandwidth == 0) : means UNKNOWN

Getting Analytics of a request by setting AnalyticsListener on thatAndroidNetworking.download(url,dirPath,fileName)

.setTag("downloadTest")

.setPriority(Priority.MEDIUM)

.build()

.setAnalyticsListener(new AnalyticsListener() {

@Override

public void onReceived(long timeTakenInMillis, long bytesSent, long bytesReceived, boolean isFromCache) {

Log.d(TAG, " timeTakenInMillis : " + timeTakenInMillis);

Log.d(TAG, " bytesSent : " + bytesSent);

Log.d(TAG, " bytesReceived : " + bytesReceived);

Log.d(TAG, " isFromCache : " + isFromCache);

}

})

.setDownloadProgressListener(new DownloadProgressListener() {

@Override

public void onProgress(long bytesDownloaded, long totalBytes) {

// do anything with progress

}

})

.startDownload(new DownloadListener() {

@Override

public void onDownloadComplete() {

// do anything after completion

}

@Override

public void onError(ANError error) {

// handle error

}

});

Note : If bytesSent or bytesReceived is -1 , it means it is unknown

更多例子以及 Fast Android Networking Library 项目在这里。

和RxJava一起使用Fast Android Networking请看这里。

完整信息请看我们网站上的文档:

谢谢阅读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NoHttp 是专门做Android网络请求下载的框架。支持HTTP/HTTPS,自动维持Cookie,异步/同步请求,大文件/多文件上传,文件下载;支持304缓存,302/303重定向,支持代理服务器。NoHttp特性:支持HTTP/HTTPS,自动维持Cookie,异步/同步请求,大文件/多文件上传,文件下载,上传下载均有进度。支持304缓存,自定义缓存,302/303重定向,支持代理服务器访问地址(如: Google)。NoHttp是队列,自动为请求排队,可以取消指定请求, 可以取消队列所有请求,亦可以停止队列。支持请求String、Bitmap、Json、JavaBean,可自定义扩展请求类型。Request对象包涵参数、文件、请求头等;Response对象包涵响应内容,响应头等信息,Cookie。使用Gradle构建时添加依赖:// 引用最新版 compile 'com.yolanda.nohttp:nohttp: ' // 或则引用指定版本 compile 'com.yolanda.nohttp:nohttp:1.0.0'一. 请求1.请求String数据// 请求对象 Request request = NoHttp.createStringRequest(url, requestMethod); //添加请求头 request.addHeader("AppVersioin", "2.0"); // 添加请求参数 request.add("userName", "yolanda"); //上传文件 request.add("file", new FileBinary(file)); ...2.请求Json数据// JsonObject Request request = NoHttp.createJsonObjectRequest(url, reqeustMethod); queue.add(what, request, responseListener); … // JsonArray Request request = NoHttp.createJsonArrayRequest(url, reqeustMethod); queue.add(what, request, responseListener);3. 请求Bitmap数据Request request = NoHttp.createImageRequest(url, requestMethod); ...4. 取消请求取消单个请求Request request = NoHttp.createStringRequest(url); ... request.cancel();从队列中取消指定的请求Request request = NoHttp.createStringRequest(url); request.setCancelSign(sign); … queue.cancelBySign(sign);取消队列中所有请求queue.cancelAll();停止队列RequestQueue queue = NoHttp.newRequestQueue(); ... queue.stop();5. 同步请求// 在当前线程发起请求,在线程这么使用 Request request = NoHttp.createStringRequest(url); Response response = NoHttp.startRequestSync(request); if (response.isSucceed()) {     // 请求成功 } else {     // 请求失败 }二. 缓存1. Http标准协议的缓存,比如响应码是304时现在很多公司使用了RESTFUL风格来写Http API,所以这个是必须有的。Request request = NoHttp.createJsonObjectRequest(url); // NoHttp本身是RESTFUL风格的标准Http协议,所以这里不用设置或者设置为DEFAULT request.setCacheMode(CacheMode.DEFAULT); ...2. 当请求服务器失败的时候,读取缓存Request request = NoHttp.createJsonObjectRequest(url); // 非标准Http协议,改变缓存模式为REQUEST_FAILED_READ_CACHE request.setCacheMode(CacheMode.REQUEST_FAILED_READ_CACHE); ...3. 如果发现有缓存直接成功,没有缓存才请求服务器我们知道ImageLoader的核心除了内存优化外,剩下一个就是发现把内地有图片则直接使用,没有则请求服务器,所以NoHttp这一点非常使用做一个ImageLoader。Request request = NoHttp.createJsonObjectRequest(url); // 非标准Http协议,改变缓存模式为IF_NONE_CACHE_REQUEST request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST); ...请求图片,缓存图片。// 如果没有缓存才去请求服务器,否则使用缓存,缓存图片演示 Request request = NoHttp.createImageRequest(imageUrl); request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST); ...4. 仅仅读取缓存Request request = NoHttp.createJsonObjectRequest(url); // 非标准Http协议,改变缓存模式为ONLY_READ_CACHE request.setCacheMode(CacheMode.ONLY_READ_CACHE); ...注意:缓存不管是String、Json、图片还是任何请求都可以被NoHttp缓存二、响应OnResponseListener responseListener = new OnResponseListener() {     @Override     public void onStart(int what) {         // 请求开始时,可以显示一个Dialog     }     @Override     public void onFinish(int what) {         // 请求接受时,关闭Dialog     }     @Override     public void onSucceed(int what, Response response) {         // 接受请求结果         String result = response.get();         // Bitmap imageHead = response.get(); // 如果是bitmap类型,都是同样的用法     }     @Override     public void onFailed(int what, String url, Object tag, Exception exception, ...) {         // 请求失败或者发生异常         // 这里根据exception处理不同的错误,比如超时、网络不好等     } };三. 自定义请求类型: FastJsonRequest1.定义请求对象public class FastJsonRequest extends RestRequestor { public FastJsonRequest(String url) {     super(url); } public FastJsonRequest(String url, RequestMethod requestMethod) {     super(url, requestMethod); } @Override public JSONObject parseResponse(String url, Headers headers, byte[] responseBody) {     String result = StringRequest.parseResponseString(url, headers, responseBody);     JSONObject jsonObject = null;     if (!TextUtils.isEmpty(result)) {         jsonObject = JSON.parseObject(result);     } else {         // 这里默认的错误可以定义为你们自己的数据格式         jsonObject = JSON.toJSON("{}");     }     return jsonObject; } @Override public String getAccept() {     // 告诉服务器你接受什么类型的数据, 会添加到请求头的Accept中     return "application/json;q=1"; } }2.使用自定义请求-和NoHttp默认请求没有区别Request mRequest = new FastJsonRequest(url, requestMethod); queue.add(what, mRequest, responseListener);五. 下载文件发起下载请求//下载文件 downloadRequest = NoHttp.createDownloadRequest(url, fielDir, fileName, true, false); // what 区分下载 // downloadRequest 下载请求对象 // downloadListener 下载监听 CallServer.getDownloadInstance().add(0, downloadRequest, downloadListener);暂停或者停止下载downloadRequest.cancel();监听下载过程private DownloadListener downloadListener = new DownloadListener() {     @Override     public void onStart(int what, boolean resume, long preLenght, Headers header, long count) {     }     @Override     public void onProgress(int what, int progress, long downCount) {         // 更新下载进度     }     @Override     public void onFinish(int what, String filePath) {     }     @Override     public void onDownloadError(int what, StatusCode code, CharSequence message) {     }     @Override     public void onCancel(int what) {     } }; 标签:NoHttp
本人测试过,挺好用的,省去了好多麻烦:afinal 0.3 主要更新如下: 1、更新FinalBitmap模块,解决线程并发没有回收线程的问题 2、重写了FinalHttp模块 具体 change log 如下: FinalBitmap添加三个方法 public void onResume() public void onPause() public void onDestroy() 在activity生命周期方法中调用给方法释放内存和暂停图片加载线程 FinalHttp添加方法如下(目前AjaxCallBack泛型只支持String和file。有时间将会扩展JSONObject,xmlDom,byte[],bitmap等): public HttpClient getHttpClient() public HttpContext getHttpContext() public void configCookieStore(CookieStore cookieStore) //配置cookie public void configUserAgent(String userAgent) public void configTimeout(int timeout)//配置超时时间 public void configSSLSocketFactory(SSLSocketFactory sslSocketFactory) //配置https请求 public void configRequestExecutionRetryCount(int count)//配置网络异常自动重复连接请求次数 public void addHeader(String header, String value) //添加http请求头 //------------------get 请求----------------------- public void get( String url, AjaxCallBack<? extends Object> callBack) public void get( String url, AjaxParams params, AjaxCallBack<? extends Object> callBack) public void get( String url, Header[] headers, AjaxParams params, AjaxCallBack<? extends Object> callBack) public Object getSync( String url) //同步get请求,请在子线程执行这个操作,否则非常有可能报ANR public Object getSync( String url, AjaxParams params) public Object getSync( String url, Header[] headers, AjaxParams params) //------------------post 请求----------------------- public void post(String url, AjaxCallBack<? extends Object> callBack) public void post(String url, AjaxParams params, AjaxCallBack<? extends Object> callBack) public void post( String url, HttpEntity entity, String contentType, AjaxCallBack<? extends Object> callBack) public void post( String url, Header[] headers, AjaxParams params, String contentType,AjaxCallBack<? extends Object> callBack) public void post( String url, Header[] headers, HttpEntity entity, String contentType,AjaxCallBack<? extends Object> callBack) public Object postSync(String url) //同步post请求,请在子线程执行这个操作,否则非常有可能报ANR public Object postSync(String url, AjaxParams params) public Object postSync( String url, HttpEntity entity, String contentType) public Object postSync( String url, Header[] headers, AjaxParams params, String contentType) public Object postSync( String url, Header[] headers, HttpEntity entity, String contentType) //------------------put 请求----------------------- public void put(String url, AjaxCallBack<? extends Object> callBack) public void put( String url, AjaxParams params, AjaxCallBack<? extends Object> callBack) public void put( String url, HttpEntity entity, String contentType, AjaxCallBack<? extends Object> callBack) public void put(String url,Header[] headers, HttpEntity entity, String contentType, AjaxCallBack<? extends Object> callBack) public Object putSync(String url) //同步put请求,请在子线程执行这个操作,否则非常有可能报ANR public Object putSync( String url, AjaxParams params) public Object putSync(String url, HttpEntity entity, String contentType) public Object putSync(String url,Header[] headers, HttpEntity entity, String contentType) //------------------delete 请求----------------------- public void delete( String url, AjaxCallBack<? extends Object> callBack) public void delete( String url, Header[] headers, AjaxCallBack<? extends Object> callBack) public Object deleteSync(String url) //同步delete请求,请在子线程执行这个操作,否则非常有可能报ANR public Object deleteSync( String url, Header[] headers) //---------------------下载--------------------------------------- public void download(String url,String target,AjaxCallBack<File> callback) public void download( String url,AjaxParams params, String target, AjaxCallBack<? extends Object> callback) 附送请求demo和下载demo

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值