1、主要参考自:https://b23.tv/FABE0n
2、内容如果有不对的,希望可以指出或补充。
3、新知识。
OKHttp:是一个高效的HTTP客户端。支持get请求和post请求,支持基于Http/https的(大)文件上传和下载,支持加载图片,支持连接同一个地址的链接共享同一个socket(计算机之间进行通信的一种约定或一种方式),通过连接池来减小响应延迟,还有下载文件透明的GZIP压缩(网站压缩加速的一种技术),请求缓存等优势。用于替代HttpUrlConnection和AsyncHttpClient
。
其核心主要有:路由、连接协议、拦截器(主要是指添加、移除或转换请求或回应的头部信息)、代理、安全性认证、连接池以及网络适配。
这个框架也是square公司开源的一个网络请求库(okhttp内部依赖okio)。已被Google使用在Android源码上。
OKHttp使用时必须在子线程中执行
。
1 依赖
对应的build.gradle文件
项目清单文件
2 布局
3 代码
MainActivity.java
package com.example.testokhttp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final int GET = 1;
private static final int POST = 2;
private Button btnGet,btnPost;
private TextView tvResult;
private OkHttpClient client = new OkHttpClient();
//解决不能在子线程中显示在文本上
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case GET:
tvResult.setText((String) msg.obj);//获取数据
break;
case POST:
tvResult.setText((String) msg.obj);//获取数据
break;
}
}
};
//编码配置
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取控件
btnGet = findViewById(R.id.btn_get);
btnPost = findViewById(R.id.btn_post);
tvResult = findViewById(R.id.tv_result);
//设置点击事件
btnGet.setOnClickListener(this);
btnPost.setOnClickListener(this);
}
@Override
//点击事件
public void onClick(View v) {
switch (v.getId()){
//使用原生的okhttp请求网络数据-get、post
case R.id.btn_get:
getDataFromGet();
break;
case R.id.btn_post:
getDataFromPost();
break;
}
}
//开启子线程,调get方法
private void getDataFromGet() {
//new一个子线程
new Thread(){
@Override
public void run() {
super.run();
try {
String result = get("http://wwww.baidu.com");
Message msg = Message.obtain();
msg.what = GET;
msg.obj = result;//携带返回的数据
handler.sendMessage(msg);//发到这
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
//开启子线程,调post方法
private void getDataFromPost() {
//new一个子线程
new Thread(){
@Override
public void run() {
super.run();
try {
String result = post("https://api.github.com/markdown/raw","");
Message msg = Message.obtain();
msg.what = POST;
msg.obj = result;//携带返回的数据
handler.sendMessage(msg);//发到这
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
//异步GET请求-默认get请求
private String get(String url) throws IOException{
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
//post请求
//参数-json:上传数据时需要
private String post(String url, String json) throws IOException{
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)//
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
}
运行结果如下。
明天继续。
1、Okhttp3基本使用
2、Socket技术详解
3、下载地址