###Volley二次封装 及利用volley下载图片 并加入公司Referer防止盗链 ###Stetho调试Volley ##依赖库 加入 Volley库与GOSON库 app build.gradle中加入
//导入volley 网络请求框架
compile 'com.mcxiaoke.volley:library:1.0.19'
//导入Gson库
compile 'com.google.code.gson:gson:2.3.1'
##AndroidManifest.xml加入相关权限
<!-- 访问网络,网络定位需要上网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 允许应用读取低级别的系统日志文件 -->
<uses-permission android:name="android.permission.READ_LOGS" />
##具体代码说明 #################################################################################### ###1.加入下载图片HTTP请求中的Referer 重写Volley自带的ImageLoader->MyImageLoader 目的是为了调用重写的MyImageRequest
@Override
protected Request<Bitmap> makeImageRequest(String requestUrl, int maxWidth, int maxHeight, ImageView.ScaleType scaleType, final String cacheKey) {
//return super.makeImageRequest(requestUrl, maxWidth, maxHeight, scaleType, cacheKey);
return new MyImageRequest(requestUrl, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
onGetImageSuccess(cacheKey, response);
}
}, maxWidth, maxHeight, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
onGetImageError(cacheKey, error);
}
});
}
重写ImageRequest的目的是在getHeaders()函数中加入http Referer headers.put("Referer", "yourcompany");//防止盗链接 此值与后台服务器协商决定 不是此值的图片请求被认为不合法请求
###2.Volley网络请求
NetworkHelper networkHelper = new NetworkHelper(this);
//Get方法调用
networkHelper.sendGETRequest(url, null,MainActivity.this,"requestTag",true);
第一个参数 url:这个就是你用于网络请求的url地址 第二个参数 null:不需要传递 第三个参数 MainActivity.this 是接口传入以便网络请求的回调 因为 MainActivity已经实现回掉方法 MainActivity extends AppCompatActivity implements UIDataListener 所以网络请求数据在以下三个函数实现数据回调
@Override public void onDataChanged(JSONObject data, String tag) {
//正确返回的服务器数据
Log.i("onDataChanged", data.toString());
//返回data字段数据 :{"uid":9999999,"userName":"18550009543","nickName":null,"ico":null,"accessToken":"123_test","regMsg":null}
Gson gson = new Gson();
LoginBean status = gson.fromJson(data.toString(), LoginBean.class);
Log.i("onDataChanged", status.getUserName());
}
@Override public void onErrorHappened(String errorCode, String errorMessage, String tag) {
//正确返回的服务器数据出错
}
@Override public void onTokenTimeOutError(String code) {
//服务器Token失效
}
第四个参数 "requestTag" 传入以便区分是哪个网络请求
onDataChanged(JSONObject data, String tag)
onErrorHappened(String errorCode, String errorMessage, String tag)
这两个函数中的tag 意义区分是哪个网络请求的回调,这样就会便用不同的请求不同的处理方式
第五个参数 true 是在请求中加入了LoadingDialog 这样你不需要关于网络请求中何时打开与关闭LoadingDialog 想在网络请求中显示 LoadingDialog,传入true即可。
###3.Volley框架返回数据处理 Volley框架返回数据处理在NetworkHelper.java中处理,也是二次封装核心部分。
NetworkHelper implements Response.Listener<JSONObject>, ErrorListener
实现了返回数据类型为JSON
//框架出错返回
@Override public void onErrorResponse(VolleyError error) {
if (mLoadingDialog != null && mLoadingDialog.getShowsDialog()) {
mLoadingDialog.dismiss();
}
disposeVolleyError(error);
}
//框架正确返回
@Override public void onResponse(JSONObject response) {
if (mLoadingDialog != null && mLoadingDialog.getShowsDialog() && mLoadingDialog.isAdded()) {
mLoadingDialog.dismiss();
}
try {
disposeResponse(response);
} catch (JSONException e) {
e.printStackTrace();
}
}
不同后台可能返回的JSON数据不同,这要根据你们公司具体JSON做相应修改。 此DEMO服务器返回格式是:
{
"code": "0000",
"msg": "操作成功",
"data": {
"uid": 9999999,
"userName": "18550009543",
"nickName": null,
"ico": null,
"accessToken": "123_test",
"regMsg": null
}
}
disposeResponse函数处理:
protected void disposeResponse(JSONObject response) throws JSONException {
if (response != null) {
if (response.has("code") && response.getString("code")
.equals(ErrorCode.TokenTimeOutError))
{
uiDataListener.onTokenTimeOutError(response.getString("code"));
return;
}
//公司接口数据
if (response.has("code") && response.has("msg") /*&& response.has("data")*/) {
BaseResponseBean res = new BaseResponseBean(response);
if (res.getCode().equals(ErrorCode.OK))//正常 请求成功
{
if (!TextUtils.isEmpty(res.getData())
&& !res.getData().equals("null")
&& !res.getData().equals("[]")) {
//notifyDataChanged(new JSONObject(res.getData()));
Object json = new JSONTokener(res.getData()).nextValue();
if (json instanceof JSONObject) {//data 内容是JSONObject
JSONObject jsonObject = (JSONObject) json;
notifyDataChanged(jsonObject);
} else if (json instanceof JSONArray) {//data 内容是JSONArrary
notifyDataChanged(response);//全部数据传回去
}
} else {
String jsonNull = "{\n" +
" \"data\": \"null\"\n" +
"}";
notifyDataChanged(new JSONObject(jsonNull));
}
} else {
notifyErrorHappened(res.getCode(), res.getMsg());//业务参数出错
}
//此处要做出错情况处理
//notifyDataChanged(response);
} else//
{
notifyDataChanged(response);
}
}
}
##加入 stetho调试Volley
###1 加入库 app build.gradle中加入
compile 'com.facebook.stetho:stetho:1.3.1'
compile 'com.facebook.stetho:stetho-okhttp:1.3.1'
compile 'com.squareup.okhttp:okhttp:2.3.0'
###2 MApplicaton.java Create() 中加入
Stetho.initialize(
Stetho.newInitializerBuilder(this)
.enableDumpapp(Stetho.defaultDumperPluginsProvider(this))
.enableWebKitInspector(Stetho.defaultInspectorModulesProvider
(this))
.build());
###3 VolleyQueueController.java 中加入getStethoRequestQueue函数
public static RequestQueue getStethoRequestQueue(Context context) {
// lazy initialize the request queue, the queue instance will be
// created when it is accessed for the first time
if (requestQueue == null) {
OkHttpClient client = new OkHttpClient();
client.networkInterceptors().add(new StethoInterceptor());
requestQueue = Volley.newRequestQueue(context, new
OkHttpStack(client));
}
return requestQueue;
}
###4 NetworkHelper.java
//VolleyQueueController.getQueue(context).add(getRequestForGet(url, params));
VolleyQueueController.getStethoRequestQueue(context).add(getRequestForGet(url, params));
###5 chrome 浏览器中打开 chrome://inspect/#devices
讲完了,希望可以在你用到volley框架中用所帮助,讲的不好请提建议,谢谢!
亲,喜欢就start一下吧,有什么不明白可以联系我
#联系方式 邮箱:[email protected]