文章标题

okhttp二次封装 瞎写哈哈哈

打算换个网络框架,网上搜索了一圈发现okHttp还是不错的,不过网络请求实际上不是一个 异步的,不明白为什么有回调了却不做成异步的方式,所以自己对okhttp进行了个二次封装,能用就行。

先屡屡思路,先要有一个父类来处理网络请求,父类实现一个网络请求接口,并重写抽象方法,然后子类继承父类,调用父类重写的抽象发放然后发送请求,还需要做一个回调,把请求来的数据发送到activity,然后要实现异步就要在父类的回调里用一下handler,在大致就是这么个套路。

先在android studio中 添加okhttp的依赖

compile 'com.squareup.okhttp:okhttp:2.6.0'
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.squareup.okhttp:okhttp:2.6.0'
    compile 'de.greenrobot:greendao:1.3.7'
    testCompile 'junit:junit:4.12'
    compile 'com.google.code.gson:gson:2.2.4'
}

然后写个回调需要用的接口,一个成功的回调和一个失败的回调

public interface OkHttpCallBack {

    void onFailure(Request request, String e);

    void onResponse(JSONObject response) throws IOException;
}

然后自己在定义一个接口,里面分别是get请求和post请求的抽象方法。接口里好像都是抽象方法哈哈哈


public interface OkHttpInterface {
    /**
     * 发送 http get 请求
     *
     * @param url
     * @param params
     * @param httpRequestListener
     */
    void sendHttpGet(Activity activity, String url, Map<String, String> params, final OkHttpCallBack okHttpCallBack);

    /**
     * 发送 http post 请求
     *
     * @param url
     * @param params
     * @param bodyParams
     * @param httpRequestListener
     */
    void sendHttPost(Activity activity, String url, Map<String, String> params, Map<String, String> bodyParams, OkHttpCallBack okHttpCallBack);

}

然後就可以写父类了,实现请求的接口,重写get和post方法
在对应的方法里 调用 okhttp的get和post方法就好了,最后会有一个 回调,我们只需要在这个回调里用一下handler.post来实现异步就可以了,最后我们用自己的写的回调接口把数据传到activity就可以了。

public class OkHttpService implements OkHttpInterface {

    private OkHttpClient okHttpClient = new OkHttpClient();
    private Handler handler = new Handler();


    @Override
    public void sendHttpGet(final Activity activity, String url, Map<String, String> params, final OkHttpCallBack okHttpCallBack) {
        okHttpClient = new OkHttpClient();
        Request.Builder builder = new Request.Builder();
        final Request request = builder.get().url(url).build();

        Call call = okHttpClient.newCall(request);

        call.enqueue(new Callback() {
            @Override
            public void onFailure(final Request request, final IOException e) {


            }

            @Override
            public void onResponse(final Response response) throws IOException {
                sendSuccessResultCallback(response, okHttpCallBack);

            }
        });
    }

    @Override
    public void sendHttPost(Activity activity, String url, Map<String, String> params, Map<String, String> bodyParams, final OkHttpCallBack httpRequestListener) {
        FormEncodingBuilder formEncodingBuilder = new FormEncodingBuilder();
        Set entries = params.entrySet();
        if (entries != null) {
            Iterator iterator = entries.iterator();
            while (iterator.hasNext()) {
                Map.Entry entry = (Map.Entry) iterator.next();
                Object key = entry.getKey();
                Object value = entry.getValue();
                formEncodingBuilder.add(key.toString(), value.toString());
            }

            RequestBody body = formEncodingBuilder.build();

            Request request = new Request.Builder().url(url).post(body).build();
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Request request, IOException e) {
                    sendFailedStringCallback(request, e.getMessage(), httpRequestListener);
                }

                @Override
                public void onResponse(Response response) throws IOException {
                    sendSuccessResultCallback(response, httpRequestListener);
                }
            });
        }
    }


    private void sendSuccessResultCallback(final Response response, final OkHttpCallBack okHttpInterface) throws IOException {
        final String str = response.body().string();
        handler.post(new Runnable() {
            @Override
            public void run() {
                try {
                    okHttpInterface.onResponse(new JSONObject(str));
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private void sendFailedStringCallback(final Request response, final String e, final OkHttpCallBack okHttpInterface) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                okHttpInterface.onFailure(response, e);
            }
        });
    }
}

接下来就可以写我们的子类了,子类需要做的工作很简单 继承父类 然后写需要的请求方法,并且把参数传到父类里面执行

public class HomeService extends OkHttpService {


    public void get(Activity activity, String url, String str, final OkHttpCallBack callback) {

        sendHttpGet(activity, url, null, new OkHttpCallBack() {
            @Override
            public void onFailure(Request request, String e) {
                callback.onFailure(request, e);
            }

            @Override
            public void onResponse(JSONObject response) throws IOException {
                callback.onResponse(response);
            }
        });
    }


    public void login(final Activity activity, String username, String password, final OkHttpCallBack callback) {
        String paramsStr = HTTPURLConfig.HEARD_URL + HTTPURLConfig.LOGIN;
        Map<String, String> paramsMap = new HashMap<>();
        paramsMap.put("client_id", HTTPURLConfig.CLIENT_ID);
        paramsMap.put("client_secret", HTTPURLConfig.CLIENT_SECRET);
        paramsMap.put("grant_type", HTTPURLConfig.GRANT_TYPE);
        paramsMap.put("username", username);
        paramsMap.put("password", password);

        sendHttPost(activity, paramsStr, paramsMap, null, new OkHttpCallBack() {
            @Override
            public void onFailure(Request request, String e) {
                callback.onFailure(request, e);
            }

            @Override
            public void onResponse(JSONObject response) throws IOException {
                saveToken(activity, response);
                callback.onResponse(response);
            }
        });
    }

    private void saveToken(Activity activity, JSONObject response) {
        try {
            AccessTokenVO AccessTokenVO = new AccessTokenVO(null, response.getString("access_token"));
            DBManager.getInstance(activity).insert(AccessTokenVO);
            RefreshTokenVO refreshTokenVO = new RefreshTokenVO(null, response.getString("refreshTokenVO"));
            DBManager.getInstance(activity).insert(refreshTokenVO);

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


    }


}

然后我们的activity就可以创建 子类的对象 然后调用 请求方法 传入参数 ,就得到接口返回的数据了

@Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.login_btn:
                HomeService homeService = new HomeService();
                homeService.login(LoginActivity.this, userName.getText().toString(), password.getText().toString(), new OkHttpCallBack() {
                    @Override
                    public void onFailure(Request request, String e) {
                        Toast.makeText(LoginActivity.this, "失败 ", Toast.LENGTH_SHORT).show();

                    }

                    @Override
                    public void onResponse(JSONObject response) throws IOException {
                        startActivity(new Intent(LoginActivity.this, HomeActivity.class));
                    }
                });
                break;
        }
    }

自己尝试着封装的,最后接口是通了,不知道自己上面说的对不对,有错的地方欢迎指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值