OkHttp支持同步和异步两种请求方式。 同步请求是阻塞执行的,当请求发送后,必须等待服务器响应信息到达后才能继续执行下面的代码。在多线程环境下,若在主线程上请求网络操作,这样的操作会阻塞主线程,导致界面无响应,用户体验不好。 异步请求是非阻塞执行的,请求发送后不必等待服务器响应信息,可以继续执行下面的代码。当服务器响应信息到达后,会回调指定的回调函数,执行回调函数里面的逻辑。异步请求不会阻塞主线程,不会导致界面无响应,用户体验好。因此,在多线程环境下,建议使用异步请求,以保证界面的响应速度。在单线程环境下,如果不需要进行界面交互,则可以使用同步请求。
本地导入jar包:
implementation fileTree(includes: ['*.aar','*.jar'],dir: 'libs')
网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
一
//get请求
public void get(){
OkHttpClient okHttpClient=new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(20,TimeUnit.SECONDS)
.writeTimeout(20,TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.build();
Request.Builder builder=new Request.Builder();
Request request=builder.get().url("http://api.txapi.cn/v1/hitokoto?token=W0YtctWjTMYzM").build();
Call call=okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Toast.makeText(MainActivity.this, "失败了", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
s=response.body().string();
try {
JSONObject jo=new JSONObject(s);
JSONObject jo1=jo.getJSONObject("data");
text.setText(jo1.getString("content"));
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
}
//post请求
public void post(){
OkHttpClient okHttpClient=new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(20,TimeUnit.SECONDS)
.writeTimeout(20,TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.build();
RequestBody fromBody=new FormBody.Builder()
.add("ip","124.93.196.45")
.add("token","W0YtctWjTMYzM")
.build();
Request.Builder builder=new Request.Builder();
Request request=builder.get().url("http://api.txapi.cn/v1/ip_location").addHeader("token","").post(fromBody).build();
Call call=okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Toast.makeText(MainActivity.this, "失败了", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
s=response.body().string();
try {
JSONObject jo=new JSONObject(s);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
二
//get请求
OkHttpClient c=new OkHttpClient();
//get请求___只能在子线程
private String geturl(String url)throws IOException{
Request request =new Request.Builder()
.url(url)
.build();
Response response=c.newCall(request).execute();
return response.body().string();
}
class k implements Runnable{
@Override
public void run() {
try {
Message m=Message.obtain();
m.what=1;
m.obj=geturl("http://api.m.mtime.cn/PageSubArea/TrailerList.api");
handler.sendMessage(m);
} catch (IOException e) {
e.printStackTrace();
}
}
}
//post请求
OkHttpClient c=new OkHttpClient();
class k implements Runnable{
@Override
public void run() {
try {
Message m=Message.obtain();
m.what=1;
m.obj=posturl("http://api.m.mtime.cn/PageSubArea/TrailerList.api","");
handler.sendMessage(m);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static final MediaType JSON
=MediaType.parse("application;charset=utf-8");
private String posturl(String url,String json)throws IOException{
RequestBody body=RequestBody.create(JSON,json);
Request request =new Request.Builder()
.url(url)
.post(body)
.build();
Response response=c.newCall(request).execute();
return response.body().string();
}
Handler代码:
private Handler handler=new Handler(){
@Override
public void dispatchMessage(@NonNull Message msg) {
super.dispatchMessage(msg);
switch (msg.what){
case 1:
//获取数据
text.setText((String)msg.obj);
w.loadData((String)msg.obj,"text/html","UTF-8");
Toast.makeText(MainActivity.this, "子线程运行完毕", Toast.LENGTH_SHORT).show();
break;
}
}
};
k k1=new k();
Thread t=new Thread(k1);
t.start();
sdk版本:
plugins {
id 'com.android.application'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.0"
defaultConfig {
applicationId "com.example.my2"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}