Volley使用:
平常我们使用Volley的标准步骤是:
StringRequest stringRequest = new StringRequest("http://www.baidu.com",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
(3)调用RequestQueue的add方法将Request对象添加到请求队列中;
mQueue.add(stringRequest);
项目中使用
NetTask的关键代码
1.在build.gradle中添加依赖
//okHttp
compile 'com.squareup.okhttp3:okhttp:3.2.0'
//retrofit
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
2.创建接口,声明API
//Retrofit turns your HTTP API into a Java interface.
//创建接口,声明GitHub的API
public interface GitHubAPI {
/*
请求该接口:https://api.github.com/users/baiiu
*/
@GET("users/{user}")
Call<User> userInfo(@Path("user") String user);
}
3.在MainActivity.onCreate()方法中调用
/*
1.初始化OkHttpClient
*/
OkHttpClient client = new OkHttpClient();
/*
2.创建Retrofit
*/
retrofit = new Retrofit.Builder()
//设置OKHttpClient
.client(client)
//设置baseUrl,注意,baseUrl必须后缀"/"
.baseUrl("https://api.github.com/")
//添加Gson转换器
.addConverterFactory(GsonConverterFactory.create())
.build();
/*
2.获取GitHub的API
*/
GitHubAPI gitHubAPI = retrofit.create(GitHubAPI.class);
/*
3.异步调用
*/
Call<User> userCall = gitHubAPI.userInfo("baiiu");
userCall.enqueue(new Callback<User>() {
@Override public void onResponse(Call<User> call, Response<User> response) {
User body = response.body();
LogUtil.d(body == null ? "body == null" : body.toString());
}
@Override public void onFailure(Call<User> call, Throwable t) {
/*
判断是否被cancel掉了
*/
if (call.isCanceled()) {
LogUtil.d("the call is canceled , " + toString());
} else {
LogUtil.e(t.toString());
}
}
});
/*
取消调用
*/
//userCall.cancel();
OkHttp
功能简述
平常我们使用Volley的标准步骤是:
(1)创建一个RequestQueue队列;
RequestQueue mQueue = Volley.newRequestQueue(context);
(2)创建一个Request对象(当然实际中可能就是Request的子类了,比如:StringRequest、JsonRequest等等);StringRequest stringRequest = new StringRequest("http://www.baidu.com",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
(3)调用RequestQueue的add方法将Request对象添加到请求队列中;
mQueue.add(stringRequest);
项目中使用
/** * 运单保存 */ @Override public void createOrder(Context context, Map<String, String> postData, final MMInfoListener listener) { Map<String, String> mData = new HashMap<>(); new NetTask(Request.Method.POST, APIAction.CREATE_ORDER, new NetTask.Listener() { @Override public void onResponse(String response) { JSONObject jsonObj = null; try { jsonObj = new JSONObject(response); int status = jsonObj.getInt("errno"); if (status == 0) { MMOrder mmOrderInfo = new MMOrder(); mmOrderInfo.fromJson(jsonObj.optJSONObject("data")); listener.onSuccess(mmOrderInfo); } else { listener.onError(jsonObj.optString("errmsg")); } } catch (Exception e) { listener.onError(ERROR_CODE.RESPONSE_ERROR); } } }, new NetTask.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { listener.onError(ERROR_CODE.NETWORK_ERROR); } }, mData, postData).start(); }
NetTask的关键代码
StringRequest stringRequest = new StringRequest(this.method, url, this.mListener, this.mErrorListener, postParams); // 设置超时时间、重试次数 // stringRequest.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, APIAction.needRetry(this.action) ? 1 : 0, 1.0f)); stringRequest.setRetryPolicy(new DefaultRetryPolicy(initialTimeoutMs, maxNumRetries, 1.0f)); getRequestQueue().cancelAll(flag); stringRequest.setTag(flag); getRequestQueue().add(stringRequest);
【volley不支持图片上传 写了一个类MultipartRequest支持】
主要实现是继承volley的Request类,然后通过使用httpmim的MultipartEntity类对文件参数进行封装。
Retrofit基本用法(未封装)
1.在build.gradle中添加依赖
//okHttp
compile 'com.squareup.okhttp3:okhttp:3.2.0'
//retrofit
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
2.创建接口,声明API
//Retrofit turns your HTTP API into a Java interface.
//创建接口,声明GitHub的API
public interface GitHubAPI {
/*
请求该接口:https://api.github.com/users/baiiu
*/
@GET("users/{user}")
Call<User> userInfo(@Path("user") String user);
}
3.在MainActivity.onCreate()方法中调用
/*
1.初始化OkHttpClient
*/
OkHttpClient client = new OkHttpClient();
/*
2.创建Retrofit
*/
retrofit = new Retrofit.Builder()
//设置OKHttpClient
.client(client)
//设置baseUrl,注意,baseUrl必须后缀"/"
.baseUrl("https://api.github.com/")
//添加Gson转换器
.addConverterFactory(GsonConverterFactory.create())
.build();
/*
2.获取GitHub的API
*/
GitHubAPI gitHubAPI = retrofit.create(GitHubAPI.class);
/*
3.异步调用
*/
Call<User> userCall = gitHubAPI.userInfo("baiiu");
userCall.enqueue(new Callback<User>() {
@Override public void onResponse(Call<User> call, Response<User> response) {
User body = response.body();
LogUtil.d(body == null ? "body == null" : body.toString());
}
@Override public void onFailure(Call<User> call, Throwable t) {
/*
判断是否被cancel掉了
*/
if (call.isCanceled()) {
LogUtil.d("the call is canceled , " + toString());
} else {
LogUtil.e(t.toString());
}
}
});
/*
取消调用
*/
//userCall.cancel();
【项目封装使用】
/** * 开单详情 * * @param od_link_id * @param callback oinfo_app是模版需要字段 */ @Override public void fetchWaybillInfo(String od_link_id, String queryNum, MMCallback callback) { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("od_link_id", TextUtils.isEmpty(od_link_id) ? "" : od_link_id); jsonObject.addProperty("query_num", TextUtils.isEmpty(queryNum) ? "" : queryNum); WaybillDetailMVP.Service waybillDetail = NetTask.getInstance().create(WaybillDetailMVP.Service.class); waybillDetail.fetchWaybillInfo(jsonObject.toString(), "oinfo_app") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(NetTask.getInstance().onSubscriber(callback)); }
private NetTask() {mOkHttpClient = new OkHttpClient.Builder().retryOnConnectionFailure(false) .addInterceptor(new NetInterceptor()) .connectTimeout(TIME_OUT, TimeUnit.SECONDS) .readTimeout(TIME_OUT, TimeUnit.SECONDS) .writeTimeout(TIME_OUT, TimeUnit.SECONDS) .cookieJar(new CookieJar() { @Override public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) { String host = String.format("%s://%s:%d", httpUrl.scheme(), httpUrl.host(), httpUrl.port()); List<Cookie> cookies = new ArrayList<>(list); mCookieStore.put(host, cookies); saveCookies(); } @Override public List<Cookie> loadForRequest(HttpUrl httpUrl) { String host = String.format("%s://%s:%d", httpUrl.scheme(), httpUrl.host(), httpUrl.port()); List<Cookie> cookies = mCookieStore.get(host); return cookies != null ? cookies : new ArrayList<Cookie>(); } }) .build();}}
public <T> T create(Class<T> service) { if (mRetrofit == null) { mRetrofit = new Retrofit.Builder().baseUrl(mBaseURL) .client(mOkHttpClient) .addConverterFactory(ScalarsConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); } return mRetrofit.create(service); }
【之间区别】
OkHttp
功能介绍
Square 公司开源的 OkHttp 是一个专注于连接效率的 HTTP 客户端。OkHttp 提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能。
优点
1.支持http请求,https请求。
2.支持文件下载。
3.基于Http的文件上传。
4.加载图片。
缺点
比如callback回来是在线程里面, 不能刷新UI,需要我们手动处理。
封装比较麻烦。
Volley
功能简述
Volley是Goole在2013年Google I/O大会上推出了一个新的网络通信框架,它是开源的。Volley 的特点:特别适合数据量小,通信频繁的网络操作。
优点
1.非常适合进行数据量不大,但通信频繁的网络操作。
2.内部分装了异步线程。
3.可直接在主线程调用服务端并处理返回结果。
缺点
1.对大文件下载 Volley的表现非常糟糕。
2.只支持http请求。
3.图片加载性能一般。
http://blog.youkuaiyun.com/hwz2311245/article/details/46845271