参考链接:https://blog.csdn.net/fxjzzyo/article/details/78761373?utm_source=blogxgwz1

 

implementation 'com.squareup.okhttp3:okhttp:3.12.0'

同步请求:

需要自己处理,UI异步的更新,以及Thread的创建

package com.liboshuai.framework.manager;import android.content.Context;import java.io.IOException;import java.util.HashMap;import okhttp3.FormBody;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;/** * FileName: HttpManager * Founder: Boshuai.li * Profile: OkHttp */public class HttpManager {    private static final String HEAD_CONTENT_TYPE = "Content-Type";    private static final String CONTENT_TYPE_JSON = "application/json; charset=utf-8";    // 与服务端定好协议    public static String HEAD_TIMESTAMP = "timestamp";    private static volatile HttpManager mInstnce = null;    private OkHttpClient mOkHttpClient;    private HttpManager() {        mOkHttpClient = new OkHttpClient();    }    public static HttpManager getInstance() {        if (mInstnce == null) {            synchronized (HttpManager.class) {                if (mInstnce == null) {                    mInstnce = new HttpManager();                }            }        }        return mInstnce;    }    /**     * 请求网络     *     * @param map     */    /**     * 请求网络     *     * @param url     * @param context     * @param map     请求参数,GET时为NULL,不为NULL 则POST     * @return     */    public String startRequest(String url, Context context, HashMap map) {        //参数        String timestamp = getTimeStamp() + "";        //参数填充        FormBody.Builder bodyBuilder = null;        if (map != null) {            bodyBuilder = new FormBody.Builder();            for (String key : map.keySet()) {                String value = map.get(key);                if (value != null) {                    bodyBuilder.add(key, value);                }            }        }        Request.Builder reqBuilder = new Request.Builder();        // 添加 url 和 头部信息        reqBuilder.url(url)                .addHeader(HEAD_TIMESTAMP, timestamp)                .addHeader(HEAD_CONTENT_TYPE, CONTENT_TYPE_JSON);        // GET or POST        if (bodyBuilder != null) {            RequestBody requestBody = bodyBuilder.build();            reqBuilder.post(requestBody);        } else {            reqBuilder.get();        }        Request request = reqBuilder.build();        try {            return mOkHttpClient.newCall(request).execute().body().string();        } catch (IOException e) {            e.printStackTrace();        }        return "";    }    /**     * 获取当前时间戳     * 将最后的三位去掉     *     * @return     */    public long getTimeStamp() {        return System.currentTimeMillis() / 1000;    }    /**     * 下载      *     * @param url     * @param saveDir     * @param listener     */    public void download(final String url, final String saveDir, final OnDownloadListener listener) {        Request request = new Request.Builder().url(url).build();        mOkHttpClient.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {                listener.onDownloadFailed(e);            }            @Override            public void onResponse(Call call, Response response) throws IOException {                InputStream is = null;                byte[] buf = new byte[2048];                int len = 0;                FileOutputStream fos = null;                //储存下载文件的目录                //String savePath = isExistDir(saveDir);                try {                    is = response.body().byteStream();                    long total = response.body().contentLength();                    //不用从url 直接从path                    File file = new File(saveDir);                    fos = new FileOutputStream(file);                    long sum = 0;                    while ((len = is.read(buf)) != -1) {                        fos.write(buf, 0, len);                        sum += len;                        int progress = (int) (sum * 1.0f / total * 100);                        listener.onDownloading(progress);                    }                    fos.flush();                    //下载完成                    listener.onDownloadSuccess(file.getAbsolutePath());                } catch (Exception e) {                    listener.onDownloadFailed(e);                } finally {                    try {                        if (is != null)                            is.close();                    } catch (IOException e) {                    }                    try {                        if (fos != null) {                            fos.close();                        }                    } catch (IOException e) {                    }                }            }        });    }    /**     * 下载进度监听     */    public interface OnDownloadListener {        /**         * 下载成功         */        void onDownloadSuccess(String path);        /**         * 下载进度         *         * @param progress         */        void onDownloading(int progress);        /**         * 下载失败         */        void onDownloadFailed(Exception e);    }}

异步请求:

联合RxJava以及RxAndroid,最大化可读性:

implementation 'io.reactivex.rxjava2:rxjava:2.2.2'implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'implementation 'com.squareup.okio:okio:2.1.0'

下面上详细使用代码:

Get请求测试:

    /**     * Get 请求测试     */    public void testOKHttpManager() {        // 需要在onDestroy 时调用 disposable.dispose();        Disposable disposable = Observable.create((ObservableOnSubscribe) emitter -> {            // 获取服务端 响应            String resp = HttpManager.getInstance().startRequest(Consts.URL_BASIC_SERVER, TestActivity.this, null);            emitter.onNext(resp);            emitter.onComplete();        }).subscribeOn(Schedulers.newThread()) // 子线程执行方法                .observeOn(AndroidSchedulers.mainThread()) // 主线程回调                .subscribe(s -> parsingpResp(s));    }    /**     * 解析 服务端返回的数据     * @param respStr     */    public void parsingpResp(String respStr) {    }

POST请求测试:

/**     * POST 请求测试     */    public void testOKHttpManager2() {        // 需要在onDestroy 时调用 disposable.dispose();        Disposable disposable = Observable.create((ObservableOnSubscribe) emitter -> {            HashMap map = new HashMap<>();            // String 类型            map.put("key1", "value1");            // int类型            int value2 = 3;            map.put("key2", value2 + "");            // 获取服务端 响应            String resp = HttpManager.getInstance().startRequest(Consts.URL_BASIC_SERVER, TestActivity.this, map);            emitter.onNext(resp);            emitter.onComplete();        }).subscribeOn(Schedulers.newThread()) // 子线程执行方法                .observeOn(AndroidSchedulers.mainThread()) // 主线程回调                .subscribe(s -> parsingpResp2(s));    }    /**     * 解析 服务端返回的数据     * @param respStr     */    public void parsingpResp2(String respStr) {    }

 

更多相关文章

  1. Android测试,Android(安卓)Studio中的单元测试、UI测试和自动化测
  2. Appium+Python移动端(Android)自动化测试环境搭建
  3. Android(安卓)Gradle 插件中文指南
  4. Android应用开发中如何进行单元测试
  5. 【引用】Android(安卓)CTS 测试常见问题
  6. Android(安卓)限制启动应用最大使用内存,可供极限测试时使用
  7. Android(安卓)textView文字添加图片 imageSpan使用
  8. android 屏幕测试程序 测试R G B三色 和 全黑, 全白5种状态
  9. Linux 统计代码行数

随机推荐

  1. 【腾讯Bugly干货分享】Android动态布局入
  2. Android Studio 安装具体步骤(配图)
  3. Flutter移动开发UI框架理解(一)
  4. Android 添加一个产品
  5. 第一个Android应用程序
  6. [004] 详解Windows平台搭建Androiod开发
  7. Android(安卓)之 Service服务介绍
  8. android 关于Location of the Android SD
  9. Android(安卓)自定义View——自定义Progr
  10. Android 自定义漂亮的Seekbar样式