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

最近搞自己手头的项目时遇到了一个问题,就是使用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.搞定,这样你的数据就可以取出并处理了

猜你喜欢

转载自blog.csdn.net/qq_40731414/article/details/81916367