关于如何取出异步线程里的数据,例如网络请求回来的对象数组 您所在的位置:网站首页 异步怎么返回数据 关于如何取出异步线程里的数据,例如网络请求回来的对象数组

关于如何取出异步线程里的数据,例如网络请求回来的对象数组

2024-01-29 00:54| 来源: 网络整理| 查看: 265

最近搞自己手头的项目时遇到了一个问题,就是使用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 dataBeans = new ArrayList(); for (int i = 0; i < dataSize; i++) { dataBeans.add(garaUpdateBean.getData().get(i)); } //List 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) msg.obj; receiveHandle(updateLists); GarageAdapter adapter = GarageAdapter.getInstance(getContext(), garageList); recyclerView.setAdapter(adapter); } };

4.搞定,这样你的数据就可以取出并处理了



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有