网络框架okhttp3简单实用的封装(上传,下载,进度检测)

step1: 创建okhttpUtil工具类
public class OkhttpUtil {
    private RootBaseActivity ctx;
    private static OkhttpUtil mInstance;
    private OkHttpClient mOkHttpClient;
    private OnDownloadListener listener;
    public static final int DOWNLOAD_FAIL=0;
    public static final int DOWNLOAD_PROGRESS=1;
    public static final int DOWNLOAD_SUCCESS=2;
    public OkhttpUtil(RootBaseActivity rba){
        this.ctx = rba;
    }
    /**
     * 单例加静态对象
     */
    public static OkhttpUtil getInstance() {
        if (mInstance == null){
            synchronized (OkhttpUtil.class) {
                if (mInstance == null) {
                    mInstance = new OkhttpUtil();
                }
            }
        }
        return mInstance;
    }

    /**
     * OkHttp的一些参数配置
     */
    private OkhttpUtil() {
        mOkHttpClient = new OkHttpClient.Builder()
                .readTimeout(30, TimeUnit.SECONDS)
                .connectTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .build();
    }
    /**
     * 设置请求头
     */
    private Headers SetHeaders(Map<String, String> headersParams){
        Headers headers=null;
        okhttp3.Headers.Builder headersbuilder=new okhttp3.Headers.Builder();

        if(headersParams != null)
        {
            Iterator<String> iterator = headersParams.keySet().iterator();
            String key = "";
            while (iterator.hasNext()) {
                key = iterator.next().toString();
                headersbuilder.add(key, headersParams.get(key));
                Log.d("get http", "get_headers==="+key+"===="+headersParams.get(key));
            }
        }
        headers=headersbuilder.build();
        return headers;
    }
    /**
     * get同步请求
     */
    public void synGet(String url,Map<String, String> BodyParams,final int requestType){
        Request request = new Request.Builder()
                .url(url+setUrlParams(BodyParams))
                .build();
        try {
            Response response = mOkHttpClient .newCall(request).execute();
            //okhttp默认是utf-8编码,如果页面没设定utf-8格式,会乱码,这里手动设定为gbk即可
            if(response.isSuccessful()) {
                       /* byte[] responseBytes = response.body().bytes();
                        handler.obtainMessage(1, new String(responseBytes, "utf-8")).sendToTarget();*/
                ctx.viewHandler.obtainMessage(requestType, response.body().string()).sendToTarget();
            }else{
                ctx.viewHandler.obtainMessage(requestType, "服务器错误!").sendToTarget();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * get异步请求
     */
    public void asynGet(String url,Map<String, String> BodyParams,final int requestType){
        Request request = new Request.Builder()
                .url(url+setUrlParams(BodyParams))
                .build();
        mOkHttpClient .newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //ToastUtil.showShortToast(LoginActivity.this,"网络请求失败!!!");
                ctx.viewHandler.obtainMessage(requestType,"访问服务失败!").sendToTarget();
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                try {
                    //okhttp默认是utf-8编码,如果页面没设定utf-8格式,会乱码,这里手动设定为gbk即可
                    if(response.isSuccessful()) {
                       /* byte[] responseBytes = response.body().bytes();
                        handler.obtainMessage(1, new String(responseBytes, "utf-8")).sendToTarget();*/
                        ctx.viewHandler.obtainMessage(requestType, response.body().string()).sendToTarget();
                    }else{
                        ctx.viewHandler.obtainMessage(requestType, "服务器错误!").sendToTarget();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    /**
     * post同步请求
     */
    public void synPost(String url,Map<String, String> BodyParams,final int requestType){
        RequestBody requestBody = SetRequestBody(BodyParams);
        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();
        try {
            Response response = mOkHttpClient .newCall(request).execute();
            //okhttp默认是utf-8编码,如果页面没设定utf-8格式,会乱码,这里手动设定为gbk即可
            if(response.isSuccessful()) {
                       /* byte[] responseBytes = response.body().bytes();
                        handler.obtainMessage(1, new String(responseBytes, "utf-8")).sendToTarget();*/
                ctx.viewHandler.obtainMessage(requestType, response.body().string()).sendToTarget();
            }else{
                ctx.viewHandler.obtainMessage(requestType, "服务器错误!").sendToTarget();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * post异步请求
     */
    public void asynPost(String url,Map<String, String> BodyParams,final int requestType){
        RequestBody requestBody = SetRequestBody(BodyParams);
        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();
        mOkHttpClient .newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //ToastUtil.showShortToast(LoginActivity.this,"网络请求失败!!!");
                ctx.viewHandler.obtainMessage(requestType,"访问服务失败!").sendToTarget();
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                try {
                    //okhttp默认是utf-8编码,如果页面没设定utf-8格式,会乱码,这里手动设定为gbk即可
                    if(response.isSuccessful()) {
                       /* byte[] responseBytes = response.body().bytes();
                        handler.obtainMessage(1, new String(responseBytes, "utf-8")).sendToTarget();*/
                        ctx.viewHandler.obtainMessage(requestType, response.body().string()).sendToTarget();
                    }else{
                        ctx.viewHandler.obtainMessage(requestType, "服务器错误!").sendToTarget();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    /**
    下载文件并保存
     */
    public void download(final String url,final String saveDir,final OnDownloadListener listener){
        this.listener=listener;
        Request request=new Request.Builder().url(url).build();
        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Message message= Message.obtain();
                message.what=DOWNLOAD_FAIL;
                ctx.viewHandler.sendMessage(message);
            }
            @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();
                    File file=new File(savePath,getNameFromUrl(url));
                    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);
                        //下载中
                        Message message=Message.obtain();
                        message.what=DOWNLOAD_PROGRESS;
                        message.obj=progress;
                        ctx.viewHandler.sendMessage(message);

                    }
                    fos.flush();
                    //下载完成
                    Message message=Message.obtain();
                    message.what=DOWNLOAD_SUCCESS;
                    message.obj=file.getAbsolutePath();
                    ctx.viewHandler.sendMessage(message);
                }catch (Exception e){
                    Message message= Message.obtain();
                    message.what=DOWNLOAD_FAIL;
                    ctx.viewHandler.sendMessage(message);
                }finally{
                    try{
                        if(is!=null)
                            is.close();
                    }catch (IOException e){

                    }
                    try {
                        if(fos!=null){
                            fos.close();
                        }
                    }catch (IOException e){

                    }
                }
            }
        });
    }
    /**
     * post请求参数1
     */
    private RequestBody SetRequestBody(Map<String, String> BodyParams){
        RequestBody body=null;
        okhttp3.FormBody.Builder formEncodingBuilder=new okhttp3.FormBody.Builder();
        if(BodyParams != null){
            Iterator<String> iterator = BodyParams.keySet().iterator();
            String key = "";
            while (iterator.hasNext()) {
                key = iterator.next().toString();
                formEncodingBuilder.add(key, BodyParams.get(key));
                Log.d("post http", "post_Params==="+key+"===="+BodyParams.get(key));
            }
        }
        body=formEncodingBuilder.build();
        return body;
    }
    /**
     * Post上传文件的参数
     */
    private RequestBody SetFileRequestBody(Map<String, String> BodyParams,Map<String, String> fileParams){
        //带文件的Post参数
        RequestBody body=null;
        okhttp3.MultipartBody.Builder MultipartBodyBuilder=new okhttp3.MultipartBody.Builder();
        MultipartBodyBuilder.setType(MultipartBody.FORM);
        RequestBody fileBody = null;
        if(BodyParams != null){
            Iterator<String> iterator = BodyParams.keySet().iterator();
            String key = "";
            while (iterator.hasNext()) {
                key = iterator.next().toString();
                MultipartBodyBuilder.addFormDataPart(key, BodyParams.get(key));
                Log.d("post http", "post_Params==="+key+"===="+BodyParams.get(key));
            }
        }

        if(fileParams != null){
            Iterator<String> iterator = fileParams.keySet().iterator();
            String key = "";
            int i=0;
            while (iterator.hasNext()) {
                key = iterator.next().toString();
                i++;
                MultipartBodyBuilder.addFormDataPart(key, fileParams.get(key));
                Log.d("post http", "post_Params==="+key+"===="+fileParams.get(key));
                fileBody = RequestBody.create(MediaType.parse("image/png"), new File(fileParams.get(key)));
                MultipartBodyBuilder.addFormDataPart(key, i+".png", fileBody);
            }
        }
        body=MultipartBodyBuilder.build();
        return body;
    }
    /**
     * get方法连接拼加参数
     */
    private String setUrlParams( Map<String, String> mapParams){
        String strParams = "";
        if(mapParams != null){
            Iterator<String> iterator = mapParams.keySet().iterator();
            String key = "";
            while (iterator.hasNext()) {
                key = iterator.next().toString();
                strParams += "&"+ key + "=" + mapParams.get(key);
            }
        }

        return strParams;
    }
    /**
     * 判断文件下载目录是否存在
     */
    private String isExistDir(String saveDir) throws IOException {
        File downloadFile=new File(saveDir);
        if(!downloadFile.mkdirs()){
            downloadFile.createNewFile();
        }
        String savePath=downloadFile.getAbsolutePath();
        return savePath;
    }
    /**
     * 从路径获取文件名
     */
    private String getNameFromUrl(String url) {
        return url.substring(url.lastIndexOf("/")+1);
    }

    /**
     * 下载进度监听
     */
    public interface OnDownloadListener{
        /**
         * 下载成功
         */
        void onDownloadSuccess(String path);
        /**
         * 下载进度
         * @param progress
         */
        void onDownloading(int progress);
        /**
         * 下载失败
         */
        void onDownloadFailed();
    }
}
step2: 创建RootBaseActivity
public abstract class RootBaseActivity extends Activity {
   public Handler viewHandler = null;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
 }
step3: Activity中调用
public class LoginActivity extends RootBaseActivity {
    private static final String TAG = "LoginActivity";
    public static final int BACK_FROM_DETAIL = 0x000001; 
    private OkhttpUtil okhttpUtil;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 沉浸式
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
        setContentView(R.layout.activity_login);
        okhttpUtil = new OkhttpUtil(this);
        doHandler();
        okhttpUtil.asynGet("url","map集合","请求码");
}
/**
 * 消息处理
 */
private void doHandler() {
    viewHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1:
                    //处理返回信息
                    break;
                default:
                    break;
            }
        }

    };
}
}

 

 

 

转载于:https://my.oschina.net/zdcn/blog/1607863

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值