Asynchttpclient的使用及请求与响应封装

来源:互联网 发布:汽车配件管理销售软件 编辑:程序博客网 时间:2024/05/21 09:47

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方法

其实以上套用模式来看,更简单清晰易懂,可惜本人对模式还不甚了解。

0 0
原创粉丝点击