当前位置:   article > 正文

Android 网络请求-AsyncHttpClient封装(超详细版)_android asynchttpclient

android asynchttpclient

前言

最近捣鼓android,但学习不多,索性完全把android当前端玩了,然后自己写了个后端服务,所以这个中间过程就需要网络请求,找了个三方库,即AsyncHttpClient,下面就是自己简单的封装了下getpost方法,这两个也够我目前业务开发了。

如果想看下代码的可以按照顺序慢慢看,如果有不喜欢看代码,就喜欢直接复制粘贴的,也可以直接点目录,倒数第二个大标题《完整代码》,添加文件,复制代码,然后目录最后一个《外部使用》简单看下实现效果模仿者来就好了。

1、为项目添加网络权限

打开项目清单文件,添加如下两行代码即可,有权限才能开网络请求嘛。

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  • 1
  • 2

在这里插入图片描述

2、新建一个Axios.java文件,写入如下代码

文件名其实是由于之前搞前端习惯用axios库,也是个非常优秀的请求库;代码的相关注释我已写好,其中主要分为几个部分:

  • 基本配置(请求地址、超时时间,合法状态码)
  • get和post方法的实现
  • 加载提示(请求前、请求结束后)
  • 请求反馈(回调)

2.1先看基本配置吧

这个其实没什么太多说的,光看注释应该是看的懂的

private Context context; // 上下文,用来给弹框反馈提示用的
private AsyncHttpClient asyncHttpClient; // asyncHttpClient对象
private ProgressDialog waitingDialog = null; // 弹框对象
private String dialogTitle = "", dialogMsg = ""; // 弹框标题和内容
private static String baseURL = "http://xxxx:5000"; // 请求地址
private static int ConnectTimeOut = 5000; // 超时时间
private CallBackFun callBackFun; // 回调接口
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.2 get和post的实现

get:
注意:这里我是没有在方法中体现携带方法的,要携带参数一般是直接拼在url后面,或者你可以看看post的实现。
还有,你可能会看到两个失败的回调的实现,之所以是两个,是因为这个请求的错误有可能有很多情况,有可能400、有可能500,也有可能是网络没打开等等原因,但我业务又不是很复杂,所以没有深究,就把两种实现都写上去,提示下用户就好了。

public void get(String url) {

        String requsetUrl = baseURL + url; // 完整链接

        if (this.asyncHttpClient != null) {

            try {

                showLoading(); // 弹框加载

                this.asyncHttpClient.get(requsetUrl, new JsonHttpResponseHandler() { // 实现AsyncHttpClient的响应

                    @SuppressLint("DefaultLocale")
                    @Override
                    public void onSuccess(int statusCode, Header[] headers, org.json.JSONObject response) { // 实现成功的回调
                        super.onSuccess(statusCode, headers, response);
                        stopLoading(); // 停止加载
                        try {

                            if (!Axios.isValidCode(Integer.parseInt(response.getString("Tag")))) { // 校验一下后端的给的code是不是合法的,注意这不是http的code,而是业务自己设定的
                                Toast.makeText(context, response.getString("Message"), Toast.LENGTH_SHORT).show();
                            } else {
                                callBackFun.onAxiosSuccess(response); // 调用外部给的成功回调方法
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }


                    @SuppressLint("DefaultLocale")
                    @Override
                    public void onFailure(int statusCode, Header[] headers, Throwable throwable, org.json.JSONObject errorResponse) { // 实现失败的回调
                        super.onFailure(statusCode, headers, throwable, errorResponse);
                        callBackFun.onAxiosFailure(errorResponse); // 调用外部失败的回调方法
                        stopLoading(); // 停止加载

                        if (errorResponse == null) {
                            Toast.makeText(context, R.string.fail + ":网络", Toast.LENGTH_SHORT).show();
                            return;
                        }

                        try {
                            Toast.makeText(context, errorResponse.getString("reason"), Toast.LENGTH_SHORT).show();
                        } catch (JSONException e) {

                            e.printStackTrace();

                        }


                    }


                    @Override

                    public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { // 实现失败的回调
                        super.onFailure(statusCode, headers, responseString, throwable);
                        callBackFun.onAxiosFailure(responseString); // 调用外部失败的回调方法
                        stopLoading(); // 停止加载

                        Toast.makeText(context, R.string.fail + responseString, Toast.LENGTH_SHORT).show();
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
                stopLoading();
            }

        }

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

post:
这里注意的地方到没什么,就是携带参数那里,我设置了用json格式发送的。

    public void post(String url, RequestParams requestParams) {
        requestParams.setUseJsonStreamer(true); // 代表是用json格式携带进body里面,即Mime-Type为application/json
        String requsetUrl = baseURL + url; //请求完整地址

        if (this.asyncHttpClient != null) {

            try {

                showLoading(); // 弹框加载
                this.asyncHttpClient.post(requsetUrl, requestParams, new JsonHttpResponseHandler() {

                    @SuppressLint("DefaultLocale")
                    @Override
                    public void onSuccess(int statusCode, Header[] headers, org.json.JSONObject response) {
                        super.onSuccess(statusCode, headers, response);
                        stopLoading();
                        try {
                            if (!Axios.isValidCode(Integer.parseInt(response.getString("Tag")))) { // 校验一下后端的给的code是不是合法的,注意这不是http的code,而是业务自己设定的
                                Toast.makeText(context, response.getString("Message"), Toast.LENGTH_SHORT).show();
                            } else {
                                callBackFun.onAxiosSuccess(response); // 调用外部的成功回调方法
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }

                    @SuppressLint("DefaultLocale")
                    @Override
                    public void onFailure(int statusCode, Header[] headers, Throwable throwable, org.json.JSONObject errorResponse) {

                        super.onFailure(statusCode, headers, throwable, errorResponse);
                        callBackFun.onAxiosFailure(errorResponse); // 调用外部失败的回调方法
                        stopLoading();
                        if (errorResponse == null) {

                            Toast.makeText(context, R.string.fail, Toast.LENGTH_SHORT).show();

                            return;
                        }
                        try {

                            Toast.makeText(context, errorResponse.getString("reason"), Toast.LENGTH_SHORT).show();

                        } catch (JSONException e) {

                            e.printStackTrace();

                        }
                    }


                    @Override

                    public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {

                        super.onFailure(statusCode, headers, responseString, throwable);
                        callBackFun.onAxiosFailure(responseString);
                        stopLoading();

                        Toast.makeText(context, R.string.fail, Toast.LENGTH_SHORT).show();

                    }

                });

            } catch (Exception e) {
                e.printStackTrace();
                stopLoading();
            }

        }

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

2.3回调实现

这里代码其实很简单,其实就是自己多琢磨琢磨就好了,没啥技巧,因为回调不管是前端还是后端,应用场景大多都是异步操作,等异步操作完了再干嘛干嘛。

public interface CallBackFun { // 外部用的回调接口

        public void onAxiosSuccess(org.json.JSONObject obj);

        public void onAxiosFailure(Object obj);

    }


    public void setOnCallBack(CallBackFun callBackFun) { // 为该对象添加回调接口

        this.callBackFun = callBackFun;

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

完整代码

package com.xlzn.hcpda.uhf.ui;

import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast;

import com.alibaba.fastjson.JSONObject;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.loopj.android.http.RequestParams;
import com.xlzn.hcpda.uhf.R;

import org.json.JSONException;

import cz.msebera.android.httpclient.Header;


public class Axios {

    private Context context; // 上下文,用来给弹框反馈提示用的
    private AsyncHttpClient asyncHttpClient; // asyncHttpClient对象
    private ProgressDialog waitingDialog = null; // 弹框对象
    private String dialogTitle = "", dialogMsg = ""; // 弹框标题和内容
    private static String baseURL = "http://xxxx:5000"; // 请求地址
    private static int ConnectTimeOut = 5000; // 超时时间
    private CallBackFun callBackFun; // 回调接口


    public Axios(Context context) { // 初始化
        this.context = context;
        this.dialogTitle = context.getString(R.string.dialog_title);
        this.dialogMsg = context.getString(R.string.dialog_loading_msg);
        AsyncHttpClient client = new AsyncHttpClient();
        client.setTimeout(Axios.ConnectTimeOut);
        this.asyncHttpClient = client;

    }


    public void setDialogTitle(String dialogTitle) { // 设置加载框的标题,用来给外部用的

        this.dialogTitle = dialogTitle;

    }


    public void setDialogMsg(String dialogMsg) { // 设置加载框的内容,用来给外部用的

        this.dialogMsg = dialogMsg;

    }


    /*
     * 没太大用,把对象实例返回出去而已,
     * 之前想着是用来外部判断网络连接没有,
     * 但是后面发现,其实如果没有网路连接的话,
     * 其实会进入 AsyncHttpClient 里面失败的回调,
     * 相当于是别人内部以及做了处理了
     * */
    public AsyncHttpClient getAsyncHttpClient() {

        if (!this.isNetConnection()) {

            Toast.makeText(context, R.string.net_error, Toast.LENGTH_SHORT).show();

            return null;

        }

        return asyncHttpClient;

    }


    private boolean isNetConnection() { // 判断是否有网络连接 包括wifi和数据流量

        if (this.context != null) {

            ConnectivityManager connectivityManager = (ConnectivityManager) this.context.getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

            if (networkInfo != null && networkInfo.isConnected()) {

                return networkInfo.getState() == NetworkInfo.State.CONNECTED;

            }

        }

        return false;

    }


    private void showLoading() {

        if (this.waitingDialog == null) {
            this.waitingDialog = new ProgressDialog(this.context);
            this.waitingDialog.setTitle(dialogTitle);
            this.waitingDialog.setMessage(dialogMsg);
            this.waitingDialog.setIndeterminate(true);
            this.waitingDialog.setCancelable(false);
        }

        this.waitingDialog.show();
    }


    private void stopLoading() {

        if (this.waitingDialog != null) this.waitingDialog.cancel();

    }


    public static boolean isValidCode(int code) {
        return code == 1;
    }


    public void get(String url) {

        String requsetUrl = baseURL + url; // 完整链接

        if (this.asyncHttpClient != null) {

            try {

                showLoading(); // 弹框加载

                this.asyncHttpClient.get(requsetUrl, new JsonHttpResponseHandler() { // 实现AsyncHttpClient的响应

                    @SuppressLint("DefaultLocale")
                    @Override
                    public void onSuccess(int statusCode, Header[] headers, org.json.JSONObject response) { // 实现成功的回调
                        super.onSuccess(statusCode, headers, response);
                        stopLoading(); // 停止加载
                        try {

                            if (!Axios.isValidCode(Integer.parseInt(response.getString("Tag")))) { // 校验一下后端的给的code是不是合法的,注意这不是http的code,而是业务自己设定的
                                Toast.makeText(context, response.getString("Message"), Toast.LENGTH_SHORT).show();
                            } else {
                                callBackFun.onAxiosSuccess(response); // 调用外部给的成功回调方法
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }


                    @SuppressLint("DefaultLocale")
                    @Override
                    public void onFailure(int statusCode, Header[] headers, Throwable throwable, org.json.JSONObject errorResponse) { // 实现失败的回调
                        super.onFailure(statusCode, headers, throwable, errorResponse);
                        callBackFun.onAxiosFailure(errorResponse); // 调用外部失败的回调方法
                        stopLoading(); // 停止加载

                        if (errorResponse == null) {
                            Toast.makeText(context, R.string.fail + ":网络", Toast.LENGTH_SHORT).show();
                            return;
                        }

                        try {
                            Toast.makeText(context, errorResponse.getString("reason"), Toast.LENGTH_SHORT).show();
                        } catch (JSONException e) {

                            e.printStackTrace();

                        }


                    }


                    @Override

                    public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { // 实现失败的回调
                        super.onFailure(statusCode, headers, responseString, throwable);
                        callBackFun.onAxiosFailure(responseString); // 调用外部失败的回调方法
                        stopLoading(); // 停止加载

                        Toast.makeText(context, R.string.fail + responseString, Toast.LENGTH_SHORT).show();

                    }

                });

            } catch (Exception e) {

                e.printStackTrace();

                stopLoading();

            }

        }

    }


    public void post(String url, RequestParams requestParams) {
        requestParams.setUseJsonStreamer(true); // 代表是用json格式携带进body里面,即Mime-Type为application/json
        String requsetUrl = baseURL + url; //请求完整地址

        if (this.asyncHttpClient != null) {

            try {

                showLoading(); // 弹框加载
                this.asyncHttpClient.post(requsetUrl, requestParams, new JsonHttpResponseHandler() {

                    @SuppressLint("DefaultLocale")
                    @Override
                    public void onSuccess(int statusCode, Header[] headers, org.json.JSONObject response) {
                        super.onSuccess(statusCode, headers, response);
                        stopLoading();
                        try {
                            if (!Axios.isValidCode(Integer.parseInt(response.getString("Tag")))) { // 校验一下后端的给的code是不是合法的,注意这不是http的code,而是业务自己设定的
                                Toast.makeText(context, response.getString("Message"), Toast.LENGTH_SHORT).show();
                            } else {
                                callBackFun.onAxiosSuccess(response); // 调用外部的成功回调方法
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }


                    @SuppressLint("DefaultLocale")
                    @Override
                    public void onFailure(int statusCode, Header[] headers, Throwable throwable, org.json.JSONObject errorResponse) {

                        super.onFailure(statusCode, headers, throwable, errorResponse);
                        callBackFun.onAxiosFailure(errorResponse); // 调用外部失败的回调方法
                        stopLoading();

                        if (errorResponse == null) {

                            Toast.makeText(context, R.string.fail, Toast.LENGTH_SHORT).show();

                            return;

                        }
                        try {

                            Toast.makeText(context, errorResponse.getString("reason"), Toast.LENGTH_SHORT).show();

                        } catch (JSONException e) {

                            e.printStackTrace();

                        }


                    }


                    @Override

                    public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {

                        super.onFailure(statusCode, headers, responseString, throwable);
                        callBackFun.onAxiosFailure(responseString);
                        stopLoading();

                        Toast.makeText(context, R.string.fail, Toast.LENGTH_SHORT).show();

                    }

                });

            } catch (Exception e) {

                e.printStackTrace();

                stopLoading();

            }

        }

    }


    public interface CallBackFun { // 外部用的回调接口

        public void onAxiosSuccess(org.json.JSONObject obj);

        public void onAxiosFailure(Object obj);

    }


    public void setOnCallBack(CallBackFun callBackFun) { // 为该对象添加回调接口

        this.callBackFun = callBackFun;

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309

外部使用

Axios axios = new Axios(mainActivity);

axios.setOnCallBack(new Axios.CallBackFun() {
    @Override
     public void onAxiosSuccess(org.json.JSONObject obj) {
         Toast.makeText(mainActivity, "请求成功", Toast.LENGTH_SHORT).show();
     }

     @Override
     public void onAxiosFailure(Object obj) {
         Toast.makeText(mainActivity,"请求失败", Toast.LENGTH_SHORT).show();
     }
 });

RequestParams requestParams = new RequestParams();
requestParams.put("name", "张三");
requestParams.put("age", 18);

axios.post("/xxx/yyy",requestParams); // post携带参数

axios.get("/aaa/bbb?id=1"); // get携带参数

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/413604
推荐阅读
相关标签
  

闽ICP备14008679号