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; } } }; } }