EventBus回撥,獲取執行緒非同步執行之後的結果
阿新 • • 發佈:2019-02-03
問題來源:
最近的專案中涉及到WebView的開發,檢查專案模組來自於SQLite,因為專案太多,如果獲取資料不使用LitePal非同步獲取,在頁面之前的跳轉會產生短暫的卡頓。(LitePal預設操作SQLite是在主執行緒中進行的,資料不多影響不大,資料太多的時候會造成UI卡頓,郭神後來修改的版本增加了非同步操作,解決了大量操作資料庫產生的問題)
其實這樣也符合常規邏輯:
頁面資料的載入等耗時操作都是放在子執行緒中進行的,為了防止產生ANR。同樣操作SQLite也是耗時操作,同樣採用非同步操作,開啟新執行緒。
解決方法:
因為使用的是LitePal的非同步查詢,返回的結果只能在onFinish()中操作,因為類別太多如果寫在裡面的話重複的程式碼太多,所以想在主方法中獲取非同步執行緒返回的結果。涉及到回撥,這裡採用的是EventBus
EventBus事件處理方法中獲取到非同步執行緒返回的json結果,然後顯示即可。
//非同步查詢 DataSupport.findAllAsync(CRM_DTYY_JDJYXM.class).listen(new FindMultiCallback() { @Override public <T> void onFinish(List<T> t) { //專案表 final List<CRM_DTYY_JDJYXM> list = (List<CRM_DTYY_JDJYXM>) t; DataSupport.where("JYJL_ID = ?", ID).findAsync(CRM_DTYY_JDJYXM_ANS.class).listen(new FindMultiCallback() { @Override public <T> void onFinish(List<T> t) { //結果表 final List<CRM_DTYY_JDJYXM_ANS> list1 = (List<CRM_DTYY_JDJYXM_ANS>) t; if (list.size() != 0) { String json = "["; for (int i = 0; i < list.size(); i++) { if (list1.size() == 0) { //結果表為空 //gson Gson gson = new GsonBuilder().serializeNulls().create(); HashMap<String, Object> map = new HashMap<>(); map.put("ID",list.get(i).getMYID()); map.put("JYLB",list.get(i).getJYLB()); map.put("YJ",list.get(i).getYJ()); map.put("EJ",list.get(i).getEJ()); map.put("SJ",list.get(i).getSJ()); map.put("SEQ",list.get(i).getSEQ()); map.put("SEQ_JL",list.get(i).getSEQ_JL()); map.put("JYJG","符合"); map.put("SHUJU", null); json += gson.toJson(map) + ","; }else { for (int j = 0; j < list1.size(); j++) { //CRM_DTYY_JDJYXM_ANS . XM_ID = CRM_DTYY_JDJYXM . ID if (list.get(i).getMYID().equals(list1.get(j).getXM_ID())) { //Gson Gson gson = new GsonBuilder().serializeNulls().create(); HashMap<String, Object> map = new HashMap<>(); map.put("ID",list.get(i).getMYID()); map.put("JYLB",list.get(i).getJYLB()); map.put("YJ",list.get(i).getYJ()); map.put("EJ",list.get(i).getEJ()); map.put("SJ",list.get(i).getSJ()); map.put("SEQ",list.get(i).getSEQ()); map.put("SEQ_JL",list.get(i).getSEQ_JL()); map.put("JYJG",list1.get(j).getJYJG()); map.put("SHUJU", list1.get(j).getSHUJU()); json += gson.toJson(map) + ","; } } } } json = json.substring(0, json.length() - 1) + "]"; //傳送黏性事件 EventBus.getDefault().postSticky(new MyJson2Webview(json)); } } }); } });
//非同步操作 事件處理 @Subscribe(threadMode = ThreadMode.POSTING,sticky = true) public void MyJson2Webview(MyJson2Webview myJson2Webview) { jsonDb = myJson2Webview.getJson(); //防止轉義 jsonDb = jsonDb.replace("\n","\\n").replace("\r","\\r").replace("\r\n","\\r\\n"); webView.addJavascriptInterface(new JSBridge(), "android"); }