android-async-http 开源框架可以使我们轻松地获取网络数据或者向服务器发送数据,最关键的是,它是异步框架,在底层使用线程池处理并发请求,效率很高,使用又特别简单。
一、简单使用
public static void reg(final Context cont,Bitmap photodata,String regData) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//将bitmap一字节流输出 Bitmap.CompressFormat.PNG 压缩格式,100:压缩率,baos:字节流
photodata.compress(Bitmap.CompressFormat.PNG, 100, baos);
baos.close();
byte[] buffer = baos.toByteArray();
System.out.println("图片的大小:"+buffer.length);
//将图片的字节流数据加密成base64字符输出
String photo = Base64.encodeToString(buffer, 0, buffer.length,Base64.DEFAULT);
//photo=URLEncoder.encode(photo,"UTF-8");
RequestParams params = new RequestParams();
params.put("photo", photo);
params.put("name", "woshishishi");//传输的字符数据
String url = "http://10.0.2.2:8080/IC_Server/servlet/RegisterServlet1";
AsyncHttpClient client = new AsyncHttpClient();
client.post(url, params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, String content){
Toast.makeText(cont, "头像上传成功!"+content, 0)
.show();
}
@Override
public void onFailure(Throwable e, String data){
Toast.makeText(cont, "头像上传失败!", 0)
.show();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
二、Request与Response对象的封装
1.LoginFragment.java
switch (v.getId()) {
case R.id.btn_submit:
String username = username_et.getText().toString();
String password = password_et.getText().toString();
android_id = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID).toUpperCase();
if (!TextUtils.isEmpty(username) && !TextUtils.isEmpty(password)) {
taoScreenDataManager.onLogin(username, password, android_id);
startProgressDialog(getString(R.string.logining));
} else {
ToastUtils.showShort(context, getString(R.string.account_or_pwd));
}
break;
case R.id.get_password:
Intent intent = new Intent(context, ForgetPassActivity.class);
context.startActivity(intent);
break;
}
由于项目中网络操作繁多,特写一个taoScreenDataManager封装各种网络操作
2.taoScreenDataManager.java
// 登陆
public void onLogin(String userName, String password, String mac) {
LoginParams params2 = new LoginParams(userName, password, mac);
final HttpBaseRequest request = new HttpBaseRequest(null, params2);
client.post(Constant.URL_APPLOGIN, request.getHttpRequestParams(), new BaseJsonHttpResponseHandler<LoginInfo>() {
@Override
public void onSuccess(int statusCode, Header[] headers, String rawJsonResponse, LoginInfo response) {
if (dataManagerListener != null)
dataManagerListener.onAppLoginParamsCallBack((LoginParams) request.getParams2(), response);
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, String rawJsonData, LoginInfo errorResponse) {
if (dataManagerListener != null)
dataManagerListener.onAppLoginParamsCallBack((LoginParams) request.getParams2(), errorResponse);
}
@Override
protected LoginInfo parseResponse(String rawJsonData, boolean isFailure) throws Throwable {
Log.v(TAG, "onLogin------" + rawJsonData);
return isFailure ? null : (LoginInfo) new LoginInfo().parseResponse(rawJsonData);
}
});
}
AsyncHttpClient.post(String url, RequestParams params, ResponseHandlerInterface responseHandler)
由于Response的是一个json数据,所以采用BaseJsonHttpResponseHandler
重写onsuccess()、onfailure()、parseResponse()。其中parseResponse()会解析出LoginInfo对象
3.HttpBaseRequest.java
public RequestParams getHttpRequestParams() {
StringBuilder sb = new StringBuilder();
RequestParams requestParams = new RequestParams();
if (params1 != null) {
String json1 = EncodingUtils.toBase64String(params1.toJson());
requestParams.put("param1", json1);
sb.append(json1);
Log.i("qiao", "param1------" + json1);
}
if (params2 != null) {
String json2 = EncodingUtils.toBase64String(params2.toJson());
requestParams.put("param2", json2);
sb.append(json2);
Log.i("qiao", "param2------" + json2);
}
requestParams.put("appId", appid);
sb.append(appid);
requestParams.put("key", EncodingUtils.hmacSHA1Encrypt(sb.toString(), privateKey));
return requestParams;
}
构建RequestParams
4.写一个LoginInfo类,作为Response泛型,需要set、get方法
其实以上套用模式来看,更简单清晰易懂,可惜本人对模式还不甚了解。