1. 程式人生 > >EventBus回撥,獲取執行緒非同步執行之後的結果

EventBus回撥,獲取執行緒非同步執行之後的結果

問題來源:

最近的專案中涉及到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");

    }