public class OKHttpUitls {
private OKHttpGetListener onOKHttpGetListener;
private MyHandler myHandler = new MyHandler();
public void post(String url, RequestBody requestBody){
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(30, TimeUnit.SECONDS);//设置超时时间
builder.readTimeout(30, TimeUnit.SECONDS);
OkHttpClient client = builder.build();
//创建请求对象
Request request = new Request.Builder()
.url(url)
.post(requestBody)//传递请求体
.build();
//创建Call请求队列,请求都是放到一个队列里面的
Call call = client.newCall(request);
//开始异步请求 即为开启一个子线程
call.enqueue(new Callback() {
//失败,成功的方法都是在子线程里面,不能直接更新UI,需要使用Handler
public void onFailure(Call call, IOException e) { //网络断开的情况
Message message = myHandler.obtainMessage();
message.obj = "{code:200,message:'网络请求失败,请检查网络'}";
message.what = 0;
myHandler.sendMessage(message);
}
public void onResponse(Call call, Response response) throws IOException {
Message message = myHandler.obtainMessage();
String json = response.body().string();
message.obj = json;
if(response.code()==200){//后台正常处理,没有发生异常的情况
message.what = 1;
}else{ //后台发生了异常
message.what = 0;
}
myHandler.sendMessage(message);
}
});
}
//在使用工具类的地方实现这个接口,将数据返回,来处理请求结果
public interface OKHttpGetListener{
void error(String error);
void success(String json);
}
//将外部实现的接口注入进来
public void setOnOKHttpGetListener(OKHttpGetListener onOKHttpGetListener){
this.onOKHttpGetListener = onOKHttpGetListener;
}
//使用Handler,将数据在主线程返回
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {//在这里进行UI界面的更新,这个方法是运行在UI主线程中的
int w = msg.what;
if (w ==0){
String error = (String) msg.obj;
onOKHttpGetListener.error(error);
}
if (w==1){
String json = (String) msg.obj;
onOKHttpGetListener.success(json);
}
}
}
}
注意:1:耗时操作不要放在UI主线程中进行,需要另开一个子线程进行处理,处理结果是在子线程中。
2:更新UI界面需要在UI主线程中进行。
问题: 如果子线程中的处理结果需要更新UI界面该怎么办?
答案: 在子线程中通过Handler来将处理结果更新到UI界面,Handler的handMessage方法是运行在主线程中。(需要理解Handler)。