Android 模拟网络请求

785 阅读3分钟

引言

在我们日常的android开发当中,往往需要用到android端和后台进行接口联调。但android端不可能等后台的接口完全做好之后再开始编写网络请求部分,而是大家一起讨论好数据结构之后便开始自行开发。这时候,android端要测试网络请求的话无非就是读取assets下的json文件或者直接通过gson把字符串转成类对象,而对于不同情况下的网络状态(连接失败、连接超时、登录失效...)只能一个一个手动的去进行修改代码,所以我就简单的封装了一下这个返回的过程,也就有了现在这篇文章了。(真的是超级简单,扩展的话后面再加啦)

代码

import android.text.TextUtils;
import android.util.Log;

import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

/**
 * description :通过传入的json字符串来模拟真实的网络请求
 * author : LongSh1z
 * email : 2674461089@qq.com
 * date : 2020/7/7 15:56
 */
public class SimulateRequest {

    private static final String TAG = "SimulateRequest";
    private static SimulateRequest instance;

    public static SimulateRequest getInstance() {
        instance = new SimulateRequest();
        return instance;
    }

    /**
     * 连接失败状态码
     */
    public static int CODE_FAIL = 0;

    /**
     * 连接超时状态码
     */
    public static int CODE_TIME_OUT = 1;

    /**
     * 连接超时成功状态码
     */
    public static int CODE_TIME_OUT_SUCCESS = 2;

    /**
     * 登录信息过期状态码
     */
    public static int CODE_UNLOGIN = 3;

    /**
     * 连接成功状态码
     */
    public static int CODE_SUCCESS = 4;

    /**
     * 连接成功但是返回数据有误状态码
     */
    public static int CODE_RETURN_FAIL = 5;

    /**
     * 网络请求回调
     */
    public interface HttpCallBack {
        void onResponse(String responseStr);

        void onFail(int code, String errMsg);
    }

    /**
     * 模拟真实的网络请求
     *
     * @param jsonStr
     * @param httpCallBack
     */
    public void sendRequest(final String jsonStr, final HttpCallBack httpCallBack) {
        if (TextUtils.isEmpty(jsonStr)) {
            throw new IllegalArgumentException("请传入有效的json字符串");
        }
        int randInt = new Random().nextInt(6);
        //如果是连接失败
        if (randInt == CODE_FAIL) {
            Log.i(TAG, "----------sendRequest: 产生的随机数为-----" + randInt + "-----连接失败----------");
            if (null != httpCallBack) {
                httpCallBack.onFail(CODE_FAIL, "连接失败");
            }
        }
        //如果是连接超时
        else if (randInt == CODE_TIME_OUT) {
            Log.i(TAG, "----------sendRequest: 产生的随机数为-----" + randInt + "-----连接超时----------");
            final Timer timer = new Timer();
            TimerTask task = new TimerTask() {
                @Override
                public void run() {
                    if (null != httpCallBack) {
                        httpCallBack.onFail(CODE_TIME_OUT, "连接超时");
                    }
                }
            };
            timer.schedule(task, 3000);
        }
        //如果是连接超时成功
        else if (randInt == CODE_TIME_OUT_SUCCESS) {
            Log.i(TAG, "----------sendRequest: 产生的随机数为-----" + randInt + "-----连接超时成功----------");
            final Timer timer = new Timer();
            TimerTask task = new TimerTask() {
                @Override
                public void run() {
                    if (null != httpCallBack) {
                        httpCallBack.onResponse(jsonStr);
                    }
                }
            };
            timer.schedule(task, 3000);
        }
        //如果是登录信息过期
        else if (randInt == CODE_UNLOGIN) {
            Log.i(TAG, "----------sendRequest: 产生的随机数为-----" + randInt + "-----登录信息过期----------");
            if (null != httpCallBack){
                httpCallBack.onFail(CODE_UNLOGIN, "登录信息过期");
            }
        }
        //如果连接成功
        else if (randInt == CODE_SUCCESS) {
            Log.i(TAG, "----------sendRequest: 产生的随机数为-----" + randInt + "-----连接成功----------");
            if (null != httpCallBack){
                httpCallBack.onResponse(jsonStr);
            }
        }
        //如果连接成功,但是返回有误
        else {
            Log.i(TAG, "----------sendRequest: 产生的随机数为-----" + randInt + "-----连接成功,但是返回有误----------");
            if (null != httpCallBack){
                httpCallBack.onResponse("");
            }
        }
    }
}

扩展

现在的版本还是非常简单的,后面的扩展大家也可以多提提建议。预计后面的扩展会从可自行增加状态码,可自行修改每个状态码的权重,可自行配置sendRequest方法中的参数,比如超时时间回调参数以及最后的代码性能优化入手,其他的意见大家也可以多讲讲哦。