一个简易的OkHttp封装
在android程序中,通常为了保证软件重要数据的实时性和我们数据的安全性,我们通常采用的方式是通过网络,从服务端去获取、修改我们的数据,而这就需要用到我们的HTTP数据请求。
目前最常见的两种请求分别是谷歌自己的HttpURLConnection,以及我认为目前最好用的请求框架OkHttp,而下面我带来的就是一个基于OkHttp框架的简易封装。
需要用到的第三方库
在开始编写代码之前展示出要使用到的库,以及这些库在以下代码中的作用
- Gson 将Map<>类型的参数转换为json格式的数据
- okhttp 请求实现类
- okio okhttp请求的通信基础
封装
public class OkHttp_Fz extends Thread{
private URL url;//请求地址
private Handler handler;//一个Handler对象,用于线程间的回调
private Map<String,String> parameter;//post请求需要使用到的参数
private boolean isLoop;//设置循环请求(同时可以通过设置该变量达到停止循环请求)
private boolean loopTime;//设置循环的间隔时间
public OkHttp_Fz(Handler handler,String URL){
this.handler = handler;
try{
this.url = new URL(URL);//将字符串形式的请求地址参数转换为URL类型
}catch(MalformedURLException e){
e.printStackTrace();
}
}
/**
*设置post请求的参数
*@param parameter 接收到的参数数据
*/
public void setParameter(Map<String,String> parameter){
this.parameter = parmeter;
}
public void run(){
super.run();
//使用do...while();设置循环请求(至少请求一次)
do{
//调用网络请求的方法进行网络数据请求
String data = Request_();
//判断请求后的数据是否为空
if(data.isEmpty()){
message(-1,"未请求到数据");
}else{
message(1,data);//请求到数据,将请求到的数据返回到调用线程中
}
//通过暂停线程来达到循环请求延时
if(isLoop){
try{
Thread.sleep(loopTime);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}while(isLoop);
}
/**
*进行网络请求的方法
*/
private String Request_(){
OkHttpClient client = new OkHttpClient();
Request request;
//判断参数变量是否为空,根据判断结果判断要使用什么请求方式
if(parameter != null){
//post请求
String parem = new Gson().toJson(parmeter);//将Map<>形式的请求参数转换为JSON形式
RequestBody body = FormBody.create(MediaType.parse("application/json"),parem);//将json格式的字符串参数转换为json数据
request = new Request.Builder()
.url(url)
.post(body)
.build();
}else{
//get请求
request = new Request.Builder()
.url(url)
.build();
}
try{
Response response = client.newCall(request).execute();//通过OkHttpClient函数提交请求,并返回请求数据
return response.body().string();
}catch(IOException e){
e.printStackTrace();
}
return "";
}
/**
* 用于回调消息的方法
* @param what 消息的键
* @param obj 消息的具体内容
*/
private void message(int what,Object obj){
Message message = Message.obtain();
message.what = what;
message.obj = obj;
handler.dispatchMessage(message);
}
}
使用方法
OkHttp请求封装完之后我们只需要在传入指定参数,调用该类即可
package com.example.OkHttp_lx;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private String URL = "http://";//请求的地址参数
private Map<String,String> parmeny = new HashMap<>();//post请求的参数
//用于回调的Handler对象
//通过重写该类的handlerMessage方法处理回调的消息
private Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch(msg.what){
case -1:
Log.e("-1",msg.obj.toString());
break;
case 1:
Log.e("1",msg.obj.toString());
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//get请求
OkHttp_Fz conntion = new OkHttp_Fz (handler,URL);//传入Handler对象和请求地址参数
conntion.start();
//post请求
OkHttp_Fz conntion = new OkHttp_Fz (handler,URL);//传入Handler对象和请求地址参数
conntion.setParameter(parmeny);//通过调用OkHttp_Fz中的setParameter方法设置请求参数
conntion.start();
}
}
最后,简易的OkHttp请求封装到此结束。
本人第一次写博客,若有不对之处,还望指正,万分感谢!