OkHTTP封装——get+post

本文分享了一个基于OkHttp的网络请求封装实例,通过单例模式实现了一个实用的NetworkUtil类,支持GET和POST异步请求,并提供了回调机制用于处理响应结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二话不说直接上代码:

public class NetworkUtil {
    private static NetworkUtil networkUtil;
    private OkHttpClient okHttpClient;
    private Handler handler;

    private NetworkUtil() {
        okHttpClient = new OkHttpClient();
        handler = new Handler(Looper.getMainLooper());
    }


    /**
     * synchronized 关键字,代表这个方法加锁,
     * 相当于不管哪一个线程(例如线程A),运行到这个方法时,
     * 都要检查有没有其它线程B(或者CD等)正在用这个方法(或者该类的其他同步方法)     * 有的话要等正在使用synchronized方法的线程B(或者C D)运行完这个方法后再运行此线程A,
     * 没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 方法和 synchronized 块。
     * 此处修饰的是代码块。
     * */
    public static NetworkUtil getInstance() {
        if (networkUtil == null) {
            synchronized (NetworkUtil.class) {
                if (networkUtil == null) {
                    networkUtil = new NetworkUtil();
                }
            }
        }

        return networkUtil;
    }

    class StringCallBack implements Callback {
        private HttpCallBack httpCallBack;
        private Request request;

        public StringCallBack(Request request, HttpCallBack httpCallBack) {
            this.request = request;
            this.httpCallBack = httpCallBack;
        }

        @Override
        public void onFailure(Call call, IOException e) {
            final IOException fe = e;
            if (httpCallBack != null) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        httpCallBack.onError(request, fe);
                    }
                });
            }
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            final String result = response.body().string();
            if (httpCallBack != null) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        httpCallBack.onSuccess(request, result);
                    }
                });
            }
        }
    }

    public void asyncGet(String url, HttpCallBack httpCallBack) {
        Request request = new Request.Builder().url(url).build();
        okHttpClient.newCall(request).enqueue(new StringCallBack(request, httpCallBack));
    }


    public void asyncPost(String url, FormBody formBody, HttpCallBack httpCallBack) {
        Request request = new Request.Builder().url(url).post(formBody).build();
        okHttpClient.newCall(request).enqueue(new StringCallBack(request, httpCallBack));
    }

    public interface HttpCallBack {
        void onError(Request request, IOException e);

        void onSuccess(Request request, String result);
    }
}

调用是这样子的:



这是某位大哥的操作,在网上找了很久了,一直没找到想要的。就是响应给我的数据怎么取出来,这下就很方便了,感谢!

这个封装是我觉得自己写的太麻烦,结果很巧就找到个合适的,我是在写一个摇一摇生成新闻的功能,经过不懈努力,还是颇有成效,明天把扫一扫弄完,后续改改界面,就可以交项目啦。不知道面试如果带这个去会不会被人家鄙视?

算来今天刚满21,比起去年,还是有很多收获的,至少现在凌晨一点的我终于不是在床上刷微博,玩游戏了。不管怎么说,自己现在没有颓废已经是很好的了,加油!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值