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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值