1. 程式人生 > >關於如何取出非同步執行緒裡的資料,例如網路請求回來的物件陣列

關於如何取出非同步執行緒裡的資料,例如網路請求回來的物件陣列

最近搞自己手頭的專案時遇到了一個問題,就是使用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.搞定,這樣你的資料就可以取出並處理了