微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

E / AndroidRuntime:致命例外:RxCachedThreadScheduler-3 .... UndeliverableException .....原因:java.lang.StackOverflowError:堆栈大小1040KB

如何解决E / AndroidRuntime:致命例外:RxCachedThreadScheduler-3 .... UndeliverableException .....原因:java.lang.StackOverflowError:堆栈大小1040KB

我正在使用Android studio 4.0。以及使用rxjava3进行链接方法,并使用org.jsonJSONTokener解析后端api json结果。 IteratorStringBuilder

每次收到后端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) 

后端Rest api收到Json字符串

result Image

启动方法menuTableRecords

请查看下面给出的标记错误

代码

1。在解析后端api的同时在行中接收到json字符串JSONTokener

2。此时,创建动态查询createPreparedStmtQuery method中的返回结果。

3。在使用JSONArrayJSONObject解析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 举报,一经查实,本站将立刻删除。