關於如何取出非同步執行緒裡的資料,例如網路請求回來的物件陣列
阿新 • • 發佈:2019-01-09
最近搞自己手頭的專案時遇到了一個問題,就是使用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.搞定,這樣你的資料就可以取出並處理了