问题来源:
最近的项目中涉及到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");
}