最近搞自己手头的项目时遇到了一个问题,就是使用okhttp向服务器请求数据回来,在它的接口方法中获取到了数据,但是赋值给一个全局的list的时候发现这个list并没有被赋值,为空,但是在okhttp的onResponse()中确实已经赋值成功了,但是到了外部发现没有,仔细想想,okhttp的onResponse()是回调接口的形式返回请求数据的,是在一个子线程中,而我们的全局list是主线程中的,异步线程中的数据无法直接取出,这就很头疼,搞了一天,发现网上也没啥资料的,就自己想方案,尝试了回调接口的方式,发现不知道是自己的问题还是,方法行不通,没有实现,还有就是改网络请求的方案,使用别人再次封装过的okhttp框架,感觉不开心,要改,想自己尝试其他的方法。然后就想起handle的方式在线程间传递数据,试了几次,也摸了好多坑,发现成了,所以分析下自己的解决方法
我是把数据取出存进一个list里面,然后传进recycleview的adapter中
1.声明一个全局的handle
private Handler handler;
2.把网络请求放到一个方法中便于我们调用,同时装载网络请求的数据进handle中,我这里是解析好的beanlist
private void updateData() {
HttpUtil.sendResquestOkttpGET(Url, new okhttp3.Callback() {
@Override
public void onFailure(Call call, IOException e) {
//
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String json = response.body().string();//将json数据拿出
Log.d("原始数据", "parseJSONWitnGSON: " + json);
Gson gson = new Gson();//新建一个Gson对象
garaUpdateBean = gson.fromJson(json, GaraUpdateBean.class);//解析json数据,并返回一个bean对象
//数据显示
int dataSize = garaUpdateBean.getData().size();
List<GaraUpdateBean.DataBean> dataBeans = new ArrayList<>();
for (int i = 0; i < dataSize; i++) {
dataBeans.add(garaUpdateBean.getData().get(i));
}
//List<GaraUpdateBean.DataBean> dataList = showAllData(garaUpdateBean);
Message msg = new Message();
msg.obj = dataBeans;
handler.sendMessage(msg);
//updateUI("刷新成功");
}
});
}
这里注意的是,如果是一个对象list可以赋值给msg.obj 然后调用handle对象的sendMessage()方法发送这个msg
handle传什么类型的数据,看你的需要,记得取得时候强转下对应类型
3.接收数据,并做一些操作
/*处理handle传过来的数据*/
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
updateLists = (List<GaraUpdateBean.DataBean>) msg.obj;
receiveHandle(updateLists);
GarageAdapter adapter = GarageAdapter.getInstance(getContext(), garageList);
recyclerView.setAdapter(adapter);
}
};
4.搞定,这样你的数据就可以取出并处理了