1.导入依赖
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
2.申请权限
<uses-permission android:name="android.permission.INTERNET"/>
android10 以上要在manifest下声明 :android:usesCleartextTraffic="true"
3.get请求
public void getRq(){ OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request.Builder().get().url("http://www.baidu.com/").build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(@NonNull Call call, @NonNull IOException e) { Log.e(TAG,e.toString()); } @Override public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { Log.e(TAG,response.body().string()); } }); }
4.post请求
public void postQQ(){ OkHttpClient okHttpClient = new OkHttpClient(); //提交键值对 FormBody formBody = new FormBody.Builder(). add("username","2545993152@qq.com"). add("password","eandhhds"). build(); //提交字符串 JSONObject jsonObject = new JSONObject(); try { jsonObject.put("name","dddd"); } catch (JSONException e) { e.printStackTrace(); } RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain;charset=utf-8"), "{username:admin;password:admin}"); //上传文件 File file = new File(Environment.getExternalStorageDirectory(), "1.png"); if (!file.exists()){ Log.e(TAG,"文件不存在"); }else{ RequestBody requestBody2 = RequestBody.create(MediaType.parse("application/octet-stream"), file); } Request request = new Request.Builder().url("http://www.jianshu.com/") .post(formBody).build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(@NonNull Call call, @NonNull IOException e) { Log.e(TAG,e.toString()); } @Override public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { Log.e(TAG,response.body().string()); } }); }
5.复杂表单
public void postMultiForm(){ RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("username", "admin")// .addFormDataPart("password", "admin")// .addFormDataPart("myfile", "1.png", RequestBody.create(MediaType.parse("application/octet-stream"), file)); }
6.下载文件
导入依赖:
implementation 'com.squareup.okio:okio:2.8.0'
public void downloadImg(View view){ OkHttpClient client = new OkHttpClient(); final Request request = new Request.Builder() .get() .url("https://www.baidu.com/img/bd_logo1.png") .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e("moer", "onFailure: ");; } @Override public void onResponse(Call call, Response response) throws IOException { //拿到字节流 InputStream is = response.body().byteStream(); int len = 0; File file = new File(Environment.getExternalStorageDirectory(), "n.png"); FileOutputStream fos = new FileOutputStream(file); byte[] buf = new byte[128]; while ((len = is.read(buf)) != -1){ fos.write(buf, 0, len); } fos.flush(); //关闭流 fos.close(); is.close(); } }); }
下载的图片设置到 imageview
@Override public void onResponse(Call call, Response response) throws IOException { InputStream is = response.body().byteStream(); final Bitmap bitmap = BitmapFactory.decodeStream(is); runOnUiThread(new Runnable() { @Override public void run() { imageView.setImageBitmap(bitmap); } }); is.close(); }
7.增加 进度条:
下载:
@Override public void onResponse(Call call, Response response) throws IOException { InputStream is = response.body().byteStream(); long sum = 0L; //文件总大小 final long total = response.body().contentLength(); int len = 0; File file = new File(Environment.getExternalStorageDirectory(), "n.png"); FileOutputStream fos = new FileOutputStream(file); byte[] buf = new byte[128]; while ((len = is.read(buf)) != -1){ fos.write(buf, 0, len); //每次递增 sum += len; final long finalSum = sum; Log.d("pyh1", "onResponse: " + finalSum + "/" + total); runOnUiThread(new Runnable() { @Override public void run() { //将进度设置到TextView中 contentTv.setText(finalSum + "/" + total); } }); } fos.flush(); fos.close(); is.close(); }
上传:
自定义类继承RequestBody
,然后重写其中的方法,将其中的上传进度通过接口回调暴露出来供我们使用。
public class CountingRequestBody extends RequestBody { //实际起作用的RequestBody private RequestBody delegate; //回调监听 private Listener listener; private CountingSink countingSink; /** * 构造函数初始化成员变量 * @param delegate * @param listener */ public CountingRequestBody(RequestBody delegate, Listener listener){ this.delegate = delegate; this.listener = listener; } @Override public MediaType contentType() { return delegate.contentType(); } @Override public void writeTo(BufferedSink sink) throws IOException { countingSink = new CountingSink(sink); //将CountingSink转化为BufferedSink供writeTo()使用 BufferedSink bufferedSink = Okio.buffer(countingSink); delegate.writeTo(bufferedSink); bufferedSink.flush(); } protected final class CountingSink extends ForwardingSink{ private long byteWritten; public CountingSink(Sink delegate) { super(delegate); } /** * 上传时调用该方法,在其中调用回调函数将上传进度暴露出去,该方法提供了缓冲区的自己大小 * @param source * @param byteCount * @throws IOException */ @Override public void write(Buffer source, long byteCount) throws IOException { super.write(source, byteCount); byteWritten += byteCount; listener.onRequestProgress(byteWritten, contentLength()); } } /** * 返回文件总的字节大小 * 如果文件大小获取失败则返回-1 * @return */ @Override public long contentLength(){ try { return delegate.contentLength(); } catch (IOException e) { return -1; } } /** * 回调监听接口 */ public static interface Listener{ /** * 暴露出上传进度 * @param byteWritted 已经上传的字节大小 * @param contentLength 文件的总字节大小 */ void onRequestProgress(long byteWritted, long contentLength); } }
File file = new File(Environment.getExternalStorageDirectory(), "1.png"); if (!file.exists()){ Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show(); }else{ RequestBody requestBody2 = RequestBody.create(MediaType.parse("application/octet-stream"), file); } //使用我们自己封装的类 CountingRequestBody countingRequestBody = new CountingRequestBody(requestBody2, new CountingRequestBody.Listener() { @Override public void onRequestProgress(long byteWritted, long contentLength) { //打印进度 Log.d("pyh", "进度 :" + byteWritted + "/" + contentLength); } });