概述步骤
a. 添加Volley库,并封装Volley为单例模式。
b. 使用OkHttp实现 基于 com.android.volley.toolbox.HttpStack 这个借口的OkHttpStack。
c. 其中使用 com.franmontiel.persistentcookiejar 实现本地持久化Cookies。
d. 因为使用Aliyun OSS 作为图片服务器,所以需要用到 Multipart Request (Volley 没有提供) 所以 继承 com.android.volley.Request 实现Multipart Request。
e.Request Samples.
顺序从B->C->A->D这个顺序
Part B 实现OkHttpStack
先引用一段代码->Github完整代码-> OkHttpStack.java
Part C 本地Cookies持久化部分
精选部分OkHttpStack.java代码,添加本地Cookies持久化部分,这里涉及到一个开源库-PersistentCookieJar(自己封装一个也很简单,参考这个开源库即可,也可用Sqlite来实现,只要显现了ClearableCookieJar的接口即可)
ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(mContext));
OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
builder.connectTimeout(timeoutMs, TimeUnit.MILLISECONDS)
.readTimeout(timeoutMs, TimeUnit.MILLISECONDS)
.writeTimeout(timeoutMs,TimeUnit.MILLISECONDS).cookieJar(cookieJar);
也没有太多可以赘述的地方。
Part A 添加Volley库+ 实现Volley 单例模式
下载Volley,然后用Android Studio 添加Module (Google 一下,无须赘述)
接着在build.gradle module 级别里添加
compile project(":volley")
setting.gradle 里 添加(修改成) app是博主module的名字,关键是吧:volley 添加进去
include ':app', ':volley'
接下来实现Volley的单例模式(Java Singleton)
MyVolleySingleton.java
抽出部分来说
里面有个ImageLoader部分,如果使用Picasso可以忽略这个部分。
Part D 封装Multipart Request
博主参考了一个封装,修改了body部分
MultipartRequest.java
大体至此,Http请求模块的配置就结束了,最后用一个Sample结尾。
博主这里是把StringRequest 封装成了静态函数,因为使用RestFul Server,因此需要用METHOD.PUT。 接着使用Fastjson转化Object 到JSON。
MyVolleySingleton.getInstance(getBaseContext()).addToRequestQueue(
RequestPutFactory.putAtv(com.alibaba.fastjson.JSON.toJSONString(putAtvModel), new RequestCallback() {
@Override
public void successCallback(String response) {
action_publish.setText("创建完成");
Atv atv=com.alibaba.fastjson.JSON.parseObject(response,Atv.class);
Intent newIntent=new Intent(getBaseContext(),ScrollingAtvActivity.class);
newIntent.putExtra("activity_id",atv.getActivity_id());
startActivity(newIntent);
}
@Override
public void failCallback(VolleyError error){
}
@Override
public void processCallback() {
}
})
);
下面是对RequestPutFactory的摘要。
public static StringRequest putAtv(final String json, final RequestCallback reqCallback){
return putRequestGenerater("/atv",json,reqCallback);
}
函数putRequestGenerater全部代码。
public static StringRequest putRequestGenerater(final String url_part,final String json, final RequestCallback reqCallback){
StringRequest stringRequest =new StringRequest(Request.Method.PUT,end_point+url_part, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
reqCallback.successCallback(response);
}
},new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error) {
// error
error.printStackTrace();
reqCallback.failCallback(error);
}
}){
@Override
public byte[] getBody() throws AuthFailureError{
try {
return json.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
@Override
public String getBodyContentType() {
return "application/json; charset=" + getParamsEncoding();
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String,String> params = new HashMap<String, String>();
params.put("Content-Type","application/json");
return params;
}
};
return stringRequest;
}
到此基本上对于Android与服务器进行交互问题就不大了。
图片上传问题后面再谈。