Android 网络请求之Xutils环境搭建
Xutils 在Android 开发中是一个比较老的网络请求框架,目前在市面上,仍然有一些老的项目在使用和维护.
本文给需要使用Xutils网络请求框架的朋友,提供一个快速搭建的代码参考:
app的module build,gradle中
添加:
compile 'org.xutils:xutils:3.4.0'
ParamsUtil.java
public class ParamsUtil {
private static final String TAG = "ParamsUtil";
public static ParamsUtil instances;
public static ParamsUtil getInstances() {
if (instances == null) {
instances = new ParamsUtil();
}
return instances;
}
//绑定参数
private RequestParams builderParams(Map<String, String> map) {
RequestParams params = new RequestParams();
Iterator<String> key = map.keySet().iterator();
while (key.hasNext()) {
String key_s = key.next();
params.addQueryStringParameter(key_s, map.get(key_s));
}
return params;
}
private RequestParams builderBodyParams(Map<String, String> map) {
RequestParams params = new RequestParams();
Iterator<String> key = map.keySet().iterator();
while (key.hasNext()) {
String key_s = key.next();
params.addBodyParameter(key_s, map.get(key_s));
}
return params;
}
public RequestParams appLogin1(String xxx, String yyy) {
Map<String, String> params = new HashMap<>();
params.put("xxx", xxx);
params.put("yyy", yyy);
return builderParams(params);
}
}
HttpRequest.java
public class HttpRequest {
public static HttpRequest instances;
public static HttpRequest getInstances() {
if (instances == null) {
instances = new HttpRequest();
}
return instances;
}
//Get请求
public void xGet(final Context context, RequestParams param, final String url, final Type cL, final RequestResultCallBack callback) {
if (NetUtil.isNetConnected(context)) {
param.setUri(url);
Logger.i("uploadUrl", String.valueOf(param));
param.setConnectTimeout(45 * 1000);//45秒缓存
final long start_time = System.currentTimeMillis();
x.http().get(param, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
Log.i("服务器成功时响应时间 = >", String.valueOf(System.currentTimeMillis() - start_time));
// Logger.json("succ", result);
Logger.e("succ", result);
NewBaseBean entity = JSON.parseObject(result, cL);
if (entity.getCode() == 200) {
callback.onSucess(entity);
} else {
callback.onFailure(-1, entity.getMessage());
}
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
callback.onFailure(32000, "您的网络不太理想,请稍后重试吧~");//超时
Logger.i("error", Constant.appendStr(ex.getMessage(),""));
}
@Override
public void onCancelled(CancelledException cex) {
Logger.i("服务器请求取消 = >", Constant.appendStr(cex.getMessage(),""));
}
@Override
public void onFinished() {
Logger.i("服务器请求完成 = >", "");
}
});
} else {
if (callback != null) {
callback.onFailure(-2, "请检查网络是否正常");
}
}
}
//Post请求
public void xPost(final Context context, final RequestParams param, final String url, final Type cL, final RequestResultCallBack callback) {
if (NetUtil.isNetConnected(context)) {
param.setUri(url);
Logger.i("uploadUrl", String.valueOf(param));
param.setConnectTimeout(45 * 1000);//45秒缓存
final long start_time = System.currentTimeMillis();
x.http().post(param, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
Logger.i("服务器成功时响应时间 = >", String.valueOf(System.currentTimeMillis() - start_time) + "ms");
Logger.i("succ", result);
NewBaseBean entity = JSON.parseObject(result, cL);
if (entity.getCode() == 200) {
callback.onSucess(entity);
} else {
callback.onFailure(-1, entity.getMessage());
}
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
callback.onFailure(32000, "您的网络不太理想,请稍后重试吧~");//超时
Logger.i("error param", Constant.appendStr(String.valueOf(param)," ",ex.getMessage()) );
}
@Override
public void onCancelled(CancelledException cex) {
Logger.i("服务器请求取消 = >", Constant.appendStr(cex.getMessage(),""));
}
@Override
public void onFinished() {
Logger.i("服务器请求完成 = >", "");
}
});
} else {
if (callback != null) {
callback.onFailure(-2, "请检查网络是否正常");
}
}
}
//只返回Json
public void xPostjson(final Context context, final RequestParams param, final String url, final RequestResultJsonCallBack callback) {
if (NetUtil.isNetConnected(context)) {
param.setUri(url);
Logger.iUrl("uploadUrl", param + "");
param.setConnectTimeout(45 * 1000);//45秒缓存
final long start_time = System.currentTimeMillis();
x.http().post(param, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
Log.i("服务器成功时响应时间 = >", String.valueOf(System.currentTimeMillis() - start_time) + "ms");
Logger.eUrl("succ", result);
callback.onSucess(result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Logger.e("errorParam", ex.getMessage());
callback.onFailure(32000, "您的网络不太理想,请稍后重试吧~");//超时
}
@Override
public void onCancelled(CancelledException cex) {
Log.i("服务器请求取消 = >", Constant.appendStr(cex.getMessage(),""));
}
@Override
public void onFinished() {
Logger.iUrl("服务器请求完成 = >", "");
}
});
} else {
if (callback != null) {
callback.onFailure(-2, "请检查网络是否正常");
}
}
}
//Get请求
public void xGet(final Context context, RequestParams param, final String url, final RequestResultJsonCallBack callback) {
if (NetUtil.isNetConnected(context)) {
param.setUri(url);
Logger.i("uploadUrl", Constant.appendStr(String.valueOf(param),""));
param.setConnectTimeout(45 * 1000);//45秒缓存
final long start_time = System.currentTimeMillis();
x.http().get(param, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
Log.i("服务器成功时响应时间 = >", String.valueOf(System.currentTimeMillis() - start_time));
// Logger.json("succ", result);
Logger.eUrl("succ", result);
callback.onSucess(result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
callback.onFailure(32000, "您的网络不太理想,请稍后重试吧~");//超时 这里报{"Message":"There was an error processing the request.","StackTrace":"","ExceptionType":""} 这个错误
Logger.i("error", ex.getMessage() + "");
}
@Override
public void onCancelled(CancelledException cex) {
Logger.i("服务器请求取消 = >", Constant.appendStr(cex.getMessage(),""));
}
@Override
public void onFinished() {
Logger.i("服务器请求完成 = >", "");
}
});
} else {
if (callback != null) {
callback.onFailure(-2, "请检查网络是否正常");
}
}
}
}
Presenter中:
public void requesMsgDetailData(int id1, final Context mContext) {
context=mContext;
RequestParams params = ParamsUtil.getInstances().getMsgDetail(id1);
BaseApplication.getInstance().httpRequest.xPostjson(mContext, params, Constant.BASE_HTTP + ContantUrl.getMsgDetail, new RequestResultJsonCallBack() {
@Override
public void onSucess(String result) {
Logger.e(TAG, result);
try {
JSONObject object = new JSONObject(result);
int code = (int) object.get("code");
if (code == Constant.RETURN_SUCCESS__STATE_CODE) {
upDateUI(result);
} else {
if (code==201){
String message = (String) object.get("message");
mView.onFail(201,message);
}else{
mView.onFail(code,"请求失败,请稍后重试!");
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(int errorCode, String errorMsg) {
mView.onFail(errorCode, errorMsg);
}
});
}
Xutils的图片上传步骤:
1.先进行图片压缩:
@Override
public void savaImg(final String url, String name, String photo, Context context) {
mPhoto = photo;
mContext = context;
this.name = name;
final Random random = new Random();
new Thread(new Runnable() {
@Override
public void run() {
int i = random.nextInt(100);
Bitmap sbitmap = ImageUtils.revitionImageSize(url, ContantUrl.Img_width, ContantUrl.Img_width);
String sPath = Utils.saveImg(sbitmap, ContantUrl.PubImgPath, "s" + i + ".png");
Logger.e(TAG, "sPath========" + sPath);
Message message = new Message();
message.what = 1000;
Bundle bundle = new Bundle();
bundle.putString("sPath", sPath);
message.setData(bundle);
handler.sendMessage(message);
}
}).start();
}
工具类裁剪图片的方法:
public static Bitmap revitionImageSize(String path, int width, int height) {
BufferedInputStream in = null;
try {
in = new BufferedInputStream(new FileInputStream(
new File(path)));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(in, null, options);
try {
if(in!=null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
int i = 0;
Bitmap bitmap = null;
while (true) {
if ((options.outWidth >> i <= width) && (options.outHeight >> i <= height)) {
try {
in = new BufferedInputStream(new FileInputStream(new File(path)));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//options.inSampleSize = 4;
options.inSampleSize = (int) Math.pow(2.0D, i);
options.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeStream(in, null, options);
break;
}
i += 1;
}
return bitmap;
}
保存图片的方法:
/**
* 保存图片
*
* @param bm
* @param pathName
* @return
*/
public static String saveImg(Bitmap bm, String savePath, String pathName) {
Log.e(TAG, "saveImg: bm================="+bm );
String filePath = savePath + pathName;
File file = new File(savePath);
if (!file.exists()) {
file.mkdirs();
}
FileOutputStream fOut;
try {
fOut = new FileOutputStream(filePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
bm.compress(Bitmap.CompressFormat.PNG, 100, fOut);
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
return null;
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
return null;
}
return filePath;
}
图片上传:
/**
* 图片上传
*
* @param sPath
* @param mPhoto
* @param mContext
*/
@Override
public void requestUploadIcon(final String name, String sPath, String mPhoto, final Context mContext, final String xxx) {
RequestParams params = new RequestParams();
if (sPath != null) {
File file = new File(sPath);
long length = file.length();
Logger.e(TAG, "--sPath---" + length);
params.addBodyParameter("file", file, "image/png");
} else {
params.addBodyParameter("file", new File(mPhoto), "image/png");
}
addRequestHeader(params, xxx);
params.setMultipart(true);
BaseApplication.getInstance().httpRequest.xPostjson(mContext, params, Constant.BASE_HTTP + ContantUrl.uploadFile, new RequestResultJsonCallBack() {
@Override
public void onSucess(String result) {
Logger.e(TAG, result);
PicBean info = Constant.getPerson(result, PicBean.class);
if (info.getCode() == Constant.RETURN_SUCCESS__STATE_CODE) {
networkUrl = info.getData().getUrl();
requestUpdatePersonInfo(name, networkUrl, mContext, token);
} else {
Logger.e(TAG, info.getMessage());
mView.onFail(info.getCode(),info.getMessage());
}
}
@Override
public void onFailure(int errorCode, String errorMsg) {
Logger.e(TAG, errorMsg);
mView.onFail(errorCode,errorMsg);
}
});
}
protected void addRequestHeader(RequestParams params, String xxx) {
params.setHeader("Content-Type", "application/json;charset=UTF-8");
params.setHeader("xxx", xxx);
}
Json 提交方式:
实例格式:
req: {
kkk: c.strEnum({ 'fff': 'TXuu, 'kk': 'nnn' }),
yyy:
mmm:
hhh: "8",
bbb: 2,
transactList: [
{
ttt: "11111",
bbb: "333333",
aaa: "124314",
xxx: "415251",
qqq: "1512351",
},
{
ttt: "11111",
bbb: "333333",
aaa: "124314",
xxx: "415251",
qqq: "1512351",
}
,
.........
]
}
//以下参数请忽略
private void submitRequestAppiontCarData() {
int size = checkList.size();//cntNum
String qqq= "";
String CC= "";
RequestParams params = new RequestParams();
addRequestHeader(params);
JSONObject object = new JSONObject();
try {
object.put("xx", CC);//上一页传递过来的数据
object.put("CC", CC);//本页提取的数据
object.put("CC", CC);//本页提取的数据
object.put("CC", String.valueOf(size));
object.put("CC", CC);
JSONArray jsonArray = new JSONArray();
for (int i = 0; i < checkList.size(); i++) {
BDSuitcaseBean.DataBean.ListBean listBean = checkList.get(i);
qqq= listBean.getQQQ();//1.
eirId = listBean.getEirId();/
if (i == 0) {
shipSeal = sealNo1Str;
JSONObject object1 = new JSONObject();
object1.put("AAA", ZZZ);
object1.put("ZZZ", ZZ);
object1.put("ZZ", ZZ);
object1.put("ZZ", ZZ);
object1.put("ZZ", ZZ);
jsonArray.put(object1);
} else if (i == 1) {
ZX= ZZ;
JSONObject object1 = new JSONObject();
object1.put("CC", CC);
object1.put("CC", CC);
object1.put("CC", CC);
object1.put("CC", CC);
object1.put("CC", CCC);
jsonArray.put(object1);
}
}
object.accumulate("transactList", jsonArray);
params.setAsJsonContent(true);//支持json
params.setBodyContent(object.toString());
} catch (JSONException e) {
Logger.e(TAG, "e--------" + e);
e.printStackTrace();
}
BaseApplication.getInstance().httpRequest.xPostjson(mContext, params, Constant.BASE_HTTP + ContantUrl.getAppointCarSumit, new RequestResultJsonCallBack() {
@Override
public void onSucess(String result) {
hideProgress();
//todo some sthing
}
@Override
public void onFailure(int errorCode, String errorMsg) {
hideProgress();
}
});
}
post请求,后台是从map中取值 从bodyContent 中是取不到值的
Post 请求 如果传递的是 纯json数据,传递参数2
1.传递格式:
{
ids: ['1','2'......],//id
truckLIP:
mobile: "" //c.Rule.mobile
}
2.后台取值的方式,从bodyContent 中才能取到值,而从map中是取不到值的
private void submitRequestAppiontCarData() {
int size = checkList.size();//cntNum
RequestParams params = new RequestParams();
addRequestHeader(params);
JSONObject object = new JSONObject();
try {
object.put("truckLIP", checkTruckNo);//上一页传递过来的数据
object.put("mobile", phone);//本页提取的数据
JSONArray jsonArray = new JSONArray();
for (int i = 0; i < size; i++) {
JXNHImportBean.DataBean.ListBean listBean = checkList.get(i);
jsonArray.put(listBean.getId());
}
object.accumulate("ids", jsonArray);
params.setAsJsonContent(true);//支持json
params.setBodyContent(object.toString());
} catch (JSONException e) {
Logger.e(TAG, "e--------" + e);
e.printStackTrace();
}
BaseApplication.getInstance().httpRequest.xPostjson(mContext, params, Constant.BASE_HTTP + ContantUrl.appintTruckDriver, new RequestResultJsonCallBack() {
@Override
public void onSucess(String result) {
hideProgress();
}
@Override
public void onFailure(int errorCode, String errorMsg) {
hideProgress();
}
});
}