使用OkHttp实现更多功能(Get、Post异步请求、使用Post传输Json、File对象)
参考文章:https://blog.csdn.net/fightingXia/article/details/70947701
public class OkHttpGetAsyncActivity extends Activity {
private final int OKHTTP_GET_SUCCESS = 0;
private final int OKHTTP_GET_FAIL = 1;
private Button send_http;
private TextView get_http;
String responseData;
//接收OkHttp中发送的Message,根据不同的Message进行不同的UI操作
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case OKHTTP_GET_SUCCESS:
Toast.makeText(OkHttpGetAsyncActivity.this, "Success", Toast.LENGTH_SHORT).show();
get_http.setText(responseData);
break;
case OKHTTP_GET_FAIL:
Toast.makeText(OkHttpGetAsyncActivity.this, "Failure", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ok_http);
send_http = findViewById(R.id.send_Okhttp);
get_http = findViewById(R.id.get_Okhttp);
send_http.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//这里实现Get请求
// getDataAsync();
//这里实现Post请求(传递键值对参数)
// getDataPostAsync();
//这里实现Post请求(传递Json对象)
// getDataPostJsonAsync();
//这里实现Post请求(传递File对象)
getDataPostFileAsync();
}
});
get_http.setMovementMethod(new ScrollingMovementMethod());
}
private void getDataAsync() {
//Get的异步请求不需要开启子线程,但是在其回调函数中还是在子线程中执行
//所以更改UI还是需要在主线程中
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Message message = new Message();
message.what = OKHTTP_GET_FAIL;
handler.sendMessage(message);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){
responseData = response.body().string();
Message message = new Message();
message.what = OKHTTP_GET_SUCCESS;
handler.sendMessage(message);
}
}
});
}
private void getDataPostAsync() {
//Post的异步请求不需要开启子线程,但是在其回调函数中还是在子线程中执行
//所以更改UI还是需要在主线程中
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("arg1","123")
.add("arg2","123456")
.build();
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(requestBody)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Message message = new Message();
message.what = OKHTTP_GET_FAIL;
Log.v("onFailure",message.what + "");
handler.sendMessage(message);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.v("onResponse","onResponse ");
//response.isSuccessful()这个布尔值代表的是,你使用Post请求过后,返回时是否成功
//比如我们发送一个错误参数的Post请求,如果添加了response.isSuccessful(),那么他的条件语句不会触发,即response.isSuccessful() == false。
// if(response.isSuccessful()){
responseData = response.body().string();
Message message = new Message();
message.what = OKHTTP_GET_SUCCESS;
handler.sendMessage(message);
// }
}
});
}
private void getDataPostJsonAsync() {
OkHttpClient client = new OkHttpClient();
//设置数据类型为JSON类型
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
//JSON格式数据
String jsonStr = "{\"arg1\":\"123456\",\"arg2\":\"525\"}";
RequestBody requestBody = RequestBody.create(JSON, jsonStr);
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(requestBody)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Message message = new Message();
message.what = OKHTTP_GET_FAIL;
Log.v("onFailure",message.what + "");
handler.sendMessage(message);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.v("onResponse","onResponse ");
//response.isSuccessful()这个布尔值代表的是,你使用Post请求过后,返回时是否成功
//比如我们发送一个错误参数的Post请求,如果添加了response.isSuccessful(),那么他的条件语句不会触发,即response.isSuccessful() == false。
// if(response.isSuccessful()){
responseData = response.body().string();
Message message = new Message();
message.what = OKHTTP_GET_SUCCESS;
handler.sendMessage(message);
// }
}
});
}
private void getDataPostFileAsync() {
OkHttpClient client = new OkHttpClient();
//设置一种File对象
MediaType fileType = MediaType.parse("File/*");
File file = new File("FilePath");
RequestBody requestBody = RequestBody.create(fileType, file);
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(requestBody)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Message message = new Message();
message.what = OKHTTP_GET_FAIL;
Log.v("onFailure",message.what + "");
handler.sendMessage(message);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.v("onResponse","onResponse ");
//response.isSuccessful()这个布尔值代表的是,你使用Post请求过后,返回时是否成功
//比如我们发送一个错误参数的Post请求,如果添加了response.isSuccessful(),那么他的条件语句不会触发,即response.isSuccessful() == false。
// if(response.isSuccessful()){
responseData = response.body().string();
Message message = new Message();
message.what = OKHTTP_GET_SUCCESS;
handler.sendMessage(message);
// }
}
});
}
}