如何解决E / AndroidRuntime:致命例外:RxCachedThreadScheduler-3 .... UndeliverableException .....原因:java.lang.StackOverflowError:堆栈大小1040KB
我正在使用Android studio 4.0
。以及使用rxjava3
进行链接的方法,并使用org.json
和JSONTokener
解析后端api json结果。
Iterator
和StringBuilder
。
每次收到后端api结果后,都会在代码中的2-3个地方得到以下异常
E/AndroidRuntime: FATAL EXCEPTION: RxCachedThreadScheduler-3
Process: io.VisurConstructionBeta.app,PID: 31117
io.reactivex.rxjava3.exceptions.UndeliverableException: The exception Could not be delivered to the consumer because it has already canceled/disposed the flow or the exception has Nowhere to go to begin with. Further reading: https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling | java.lang.StackOverflowError: stack size 1040KB
at io.reactivex.rxjava3.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:367)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:68)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:56)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Caused by: java.lang.StackOverflowError: stack size 1040KB
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:649)
at java.lang.StringBuilder.append(StringBuilder.java:203)
at org.json.JSONStringer.string(JSONStringer.java:354)
at org.json.JSONStringer.value(JSONStringer.java:261)
at org.json.JSONArray.writeto(JSONArray.java:616)
at org.json.JSONStringer.value(JSONStringer.java:242)
at org.json.JSONObject.writeto(JSONObject.java:733)
at org.json.JSONObject.toString(JSONObject.java:701)
at io.visur.plugins.bgsqlitesync.sqlitedb.sqliteDB2.createPreparedStmtQuery(sqliteDB2.java:174)
at io.visur.plugins.bgsqlitesync.services.SynchroniztionService.insertSyncRecordMenuTableAndTreeTable(SynchroniztionService.java:393)
at io.visur.plugins.bgsqlitesync.services.SynchroniztionService.menuTableRecords(SynchroniztionService.java:366)
at io.visur.plugins.bgsqlitesync.services.SynchroniztionService.lambda$startSyncNow$1$SynchroniztionService(SynchroniztionService.java:54)
at io.visur.plugins.bgsqlitesync.services.-$$Lambda$SynchroniztionService$R-yIdI9lkAwhoPiCMJ7tFExv-ww.apply(UnkNown Source:10)
at io.reactivex.rxjava3.internal.operators.observable.ObservableSwitchMap$SwitchMapObserver.onNext(ObservableSwitchMap.java:111)
at io.reactivex.rxjava3.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainnormal(ObservableObserveOn.java:201)
at io.reactivex.rxjava3.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:255)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:65)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:56)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
启动方法menuTableRecords
1。在解析后端api的同时在行中接收到json字符串JSONTokener
2。此时,创建动态查询createPreparedStmtQuery method
中的返回结果。
3。在使用JSONArray
和JSONObject
解析json时。
Java代码:
private @NonNull Observable<String> menuTableRecords(PluginCall call,String apiUrl,JSObject pluginoptions) throws JSONException,IOException {
JSONObject payload = new JSONObject();
JSONArray values = pluginoptions.getJSONArray("values");
String dbname = pluginoptions.getString("database");
boolean encrypted = pluginoptions.getBoolean("encrypted");
String inmode = pluginoptions.getString("mode");
for (int i = 0; i < values.length(); i++) {
JSONObject table = (JSONObject) values.get(i);
String lastSyncTime = table.getString("LastSyncTime");
// String tableName = "FormSchema";
JSONObject msgPayload = new JSONObject();
if (lastSyncTime == "null") {
msgPayload.put("lastsynctime",JSONObject.NULL);
} else {
msgPayload.put("lastsynctime",lastSyncTime);
}
JSONObject wrapper = table.getJSONObject("MessageWrapper");
wrapper.put("Payload",msgPayload.toString());
wrapper.put("DataType","MenuTablesSync");
wrapper.put("MessageKind","READ");
// send to backend rest api to retrive json string
String resstring = this.rest.post(apiUrl,wrapper.toString());
String jsonFormattedString = new JSONTokener(resstring).nextValue()
.toString(); **//Error**
JSONObject response = new JSONObject(jsonFormattedString);
// insert sync record
insertSyncRecordMenuTableAndTreeTable(call,response);
}
return Observable.fromArray("MENU_TABLE_RECORDS");
}
private void insertSyncRecordMenuTableAndTreeTable(PluginCall call,JSONObject response) throws JSONException {
JSONArray treeData = new JSONArray();
JSONArray keys = response.names();
for (int i = 0; i < keys.length(); i++) {
String key = keys.getString(i);
String tableName = key;
JSONArray tempArray = new JSONArray(response.getString(key)); **//Error**
if (key.equals("RightMenu")) {
treeData = tempArray;
}
List<String> queries = new ArrayList<String>();
for (int j = 0; j < tempArray.length(); j++) {
String query = createPreparedStmtQuery(
((JSONObject) tempArray.get(j)),tableName);
queries.add(query);
}
}
if (treeData.length() > 0) {
createTreeTables(treeData);
}
}
public static String createPreparedStmtQuery(JSONObject record,String tableName) throws JSONException {
record = modifyRecord(record);
Iterator<String> keys = record.keys();
StringBuilder builder = new StringBuilder();
builder.append("insert or replace into ");
builder.append(tableName);
builder.append(" (");
while (keys.hasNext()) {
builder.append(keys.next()).append(",");
}
builder.setLength(builder.length() - 1);
builder.append(") values(");
keys = record.keys();
JSArray valuesArray = new JSArray();
while (keys.hasNext()) {
String key = keys.next();
if (record.get(key) != null && record.get(key) instanceof String) {
}
builder.append("?").append(",");
valuesArray.put(record.get(key));
}
builder.deleteCharat(builder.length() - 1);
builder.append(");");
JSONObject ret = new JSONObject();
ret.put("query",builder.toString());
ret.put("values",valuesArray);
return ret.toString(); **//Error**
}
private static JSONObject modifyRecord(JSONObject record)
throws JSONException {
if (record.has("ValidFrom")) {
record.remove("ValidFrom");
}
if (record.has("ValidTo")) {
record.remove("ValidTo");
}
Iterator<String> keys = record.keys();
while (keys.hasNext()) {
String key = keys.next();
if (record.get(key) instanceof JSONObject
|| record.get(key) instanceof List) {
record.put(key,((JSObject) record.get(key)).toString());
}
}
return record;
}
请非常帮助。 谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。