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

W / System.err:io.reactivex.rxjava3.exceptions.UndeliverableException:无法传递异常

如何解决W / System.err:io.reactivex.rxjava3.exceptions.UndeliverableException:无法传递异常

我在Android插件应用中使用了build job: "itext_7_dotnet/sharpen/${java.net.URLEncoder.encode branchName,'UTF-8'}" 。我试图验证是否存在递归调用,但是我找不到类似的东西。即使没有,也不确定。每次遇到此问题时,都会遇到1-2次。并且应用程序会损坏。不确定Observer或Subcriber线程或Android主线程是否出现问题,或者我是否使用了错误的可观察链接。请有人指导我解决此问题。

内部方法执行的过程如下所示: 1.调用后端REST API 2.一些数据处理,例如查询等 3.连接到sqlite并使用查询sqlite上创建,插入或更新操作

以下是示例代码 插件课程:

rxjava3

这是从插件主类调用的另一个名为'SynchroizationService'方法的类。

SynchroizationService java类

@NativePlugin
public class App extends Plugin {

    private Context context;

    public void load() {
        // Get singleton instance of database
        context = getContext();

    }
    
    
     @PluginMethod()
        public void syncNow(PluginCall call) throws IOException,JSONException {
            String result = null;

            String apiUrl = call.getString("apiUrl");
            JSArray parallelMethods = call.getArray("parallelMethods");
            JSArray synchronousMethods = call.getArray("synchronousMethods");
            String operationType = call.getString("operationType");
            JSObject pluginoptions = call.getobject("pluginoptions");

            synchroniztionService = new SynchroniztionService(context);

            synchroniztionService.startSyncNow(call,synchronousMethods,parallelMethods,apiUrl,pluginoptions)
                    .observeOn(AndroidSchedulers.mainThread()).subscribe(
                    res -> {
                        System.out.println(res);
                        retResult(call,true,DEFAULT_RETURN);
                    },onError -> {
                        System.out.println(onError);
                    },() -> {
                        System.out.println("Completed!!");
                    }
            );
        }


        private void retResult(PluginCall call,Boolean res,String message) {
            JSObject ret = new JSObject();
            ret.put("result",res);
            if (message != null) ret.put("message",message);
            call.resolve(ret);
        }
        

}

下面的//Synization service methods public @NonNull Observable<String> startSyncNow(PluginCall call,JSArray synchronousMethods,JSArray parallelMethods,String apiUrl,JSObject pluginoptions) throws JSONException,IOException { return createOrAlterTable(call,pluginoptions) .switchMap(d -> formSchemaTosqlite(call,pluginoptions)) .observeOn(Schedulers.newThread()) .switchMap(d -> menuTableRecords(call,apiUrl)) .map(d -> d); } // ### createOrAlterTable Start private Observable<JSONArray> createOrAlterTable(PluginCall call,JSObject pluginoptions) throws IOException,JSONException { // Read table from backend // Read last sync file // get user data return Observable .zip(readTableFromBackend(pluginoptions,apiUrl),readLastSyncFile(call,pluginoptions),getUserData(call,(s1,s2,s3) -> readTableFromBackendZipperFun(s1,s3,call,pluginoptions)) .subscribeOn(Schedulers.io()).observeOn(Schedulers.io()) .map(d -> d); // } private @NonNull Observable<String> readTableFromBackend( JSObject pluginoptions,String apiUrl) throws JSONException,IOException { JSONObject obj = null; JSONObject msgPayload = new JSONObject(); JSONObject wrapper = MessageTransformation .getMessageWrapper(pluginoptions); wrapper.put("Payload",msgPayload.toString()); wrapper.put("DataType","sqlLiteDDLAsync"); wrapper.put("MessageKind","READ"); // let data = JSON.parse(JSON.stringify(message)); // let options: any = getHttpHeaderOptions(); String response = this.rest.post(apiUrl,wrapper.toString()); String jsonFormattedString = new JSONTokener(response).nextValue() .toString(); // return this.http.post(apiUrl,wrapper,options) // .pipe(map((response: any) => { return response; })); // obj = new JSONObject(jsonFormattedString); return Observable.fromArray(jsonFormattedString); } private @NonNull Observable<JSONObject> readLastSyncFile(PluginCall call,JSObject pluginoptions) throws JSONException { JSONObject obj = new JSONObject(); String dbname = pluginoptions.getString("database"); boolean encrypted = pluginoptions.getBoolean("encrypted"); String inmode = pluginoptions.getString("mode"); sqliteDB sqlite = new sqliteDB(this.context,encrypted,inmode,dbname); String query = getLastSyncFileQuery(null,null); JSArray jsArray = new JSArray(); obj = sqlite.customQuery(query,new JSArray(),call); return Observable.fromArray(obj); } private String getLastSyncFileQuery(String table,String operationType) { String query = null; if (operationType != null) { query = "select lastfiLeversion from LastSync where operationtype='" + operationType + "';"; } else { query = "select lastfiLeversion from LastSync;"; } return query; } private @NonNull Observable<Boolean> getUserData(PluginCall call,JSObject pluginoptions) throws JSONException { boolean result = false; // SELECT name FROM sqlite_master WHERE type='table' AND // name='{table_name}'; String query = "SELECT name FROM sqlite_master where type='table' and name='User';"; String dbname = pluginoptions.getString("database"); boolean encrypted = pluginoptions.getBoolean("encrypted"); String inmode = pluginoptions.getString("mode"); sqliteDB sqlite = new sqliteDB(this.context,dbname); JSONObject obj = new JSONObject(); obj = sqlite.customQuery(query,call); JSONArray jsonArray = obj.getJSONArray("values"); if (jsonArray.length() > 0) { result = true; } return Observable.fromArray(result); } private JSONArray readTableFromBackendZipperFun(String sqlliteDDL,JSONObject lastFV,boolean userDataFlag,PluginCall call,JsonProcessingException { // JSONParser parser = new JSONParser(); if (lastFV != null && lastFV.has("values")) { JSONArray array = (JSONArray) lastFV.get("values"); String lastfiLeversion = null; if (array.length() > 0) { JSONObject jsonObject = (JSONObject) array.get(0); lastfiLeversion = (String) jsonObject.get("lastfiLeversion"); } JSONObject sqlliteddlObject = new JSONObject(sqlliteDDL);// null;//(JSONObject) // parser.parse(sqlliteDDL); JSONObject sqlLiteDDl = this.filtersqlLiteDDLBasedOnFiLeversion( sqlliteddlObject,lastfiLeversion,userDataFlag); JSONArray obslist$ = new JSONArray(); String fiLeversionName = ""; JSONArray jsonArray = sqlliteddlObject.names(); for (int i = 0; i < jsonArray.length(); i++) { String element = jsonArray.getString(i); String isType = element.toLowerCase().contains("create") ? "Create" : "Alter"; JSONObject jObject = (JSONObject) sqlliteddlObject.get(element); Object resJsonPathObject = JsonPath.read(jObject.toString(),"$.structure.tables"); System.out.println(resJsonPathObject); // String jsonPathJSONObject = new // JSONTokener(resJsonPathObject.toString()).nextValue().toString();// // // // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind // compile group: 'com.fasterxml.jackson.core',name: // 'jackson-databind',version: '2.11.2' ObjectMapper mapper = new ObjectMapper(); String jsonString = mapper .writeValueAsstring(resJsonPathObject); JSONObject jsonPathJSONObject = new JSONObject(jsonString); fiLeversionName = isType == "Alter" ? element : null; JSONObject jsonObj = jsonPathJSONObject != null ? jsonPathJSONObject : new JSONObject(); // observable JSONObject obseravel$ = persistenceCreateOrAlterTable( jsonObj.toString(),isType,pluginoptions,call); obslist$.put(obseravel$); } if (fiLeversionName != "") { // observable JSONObject obseravel$ = fiLeversionUpdate(fiLeversionName,call); obslist$.put(obseravel$); } // forkjoin return } JSONArray jsonArray = new JSONArray(); return jsonArray; } private JSONObject fiLeversionUpdate(String fileName,JSObject pluginoptions,PluginCall call) throws JSONException { String FiLeversionUpdatequery = persistenceGetFiLeversionUpdatequery(fileName); String dbname = pluginoptions.getString("database"); boolean encrypted = pluginoptions.getBoolean("encrypted"); String inmode = pluginoptions.getString("mode"); sqliteDB sqlite = new sqliteDB(this.context,dbname); JSONObject res = sqlite.customExecute(FiLeversionUpdatequery,call); return res; } private String persistenceGetFiLeversionUpdatequery(String fileName) { return "Update LastSync Set lastfiLeversion = '" + fileName + "';"; } private JSONObject filtersqlLiteDDLBasedOnFiLeversion( JSONObject sqlliteDDL,String lastfiLeversion,boolean userDataFlag) throws JSONException { JSONObject tempsqlLiteDDl = new JSONObject(); if (lastfiLeversion == null && !userDataFlag) { Iterator<String> keys = sqlliteDDL.keys(); while (keys.hasNext()) { String key = keys.next(); if (key.contains("Create")) { tempsqlLiteDDl.put(key,sqlliteDDL.get(key)); } } } else { JSONArray jsonArray = sqlliteDDL.names(); List<String> sqlLiteDDlList = new ArrayList<String>(); for (int i = 0; i < jsonArray.length(); i++) { sqlLiteDDlList.add(jsonArray.getString(i)); } int fiLeversionindex = sqlLiteDDlList.indexOf(lastfiLeversion); for (int index = 0; index < jsonArray.length(); index++) { String element = jsonArray.getString(index); if (element.contains("Create")) { tempsqlLiteDDl.put(element,sqlliteDDL.get(element));// sqlLiteDDl[element]; } else if (element.contains("Alter") && index > fiLeversionindex) { tempsqlLiteDDl.put(element,sqlliteDDL.get(element));// sqlLiteDDl[element]; } } } return tempsqlLiteDDl; } private JSONObject persistenceCreateOrAlterTable(String querylist,String type,PluginCall call) throws JSONException { // JSONParser parser = new JSONParser(); JSONObject queries = new JSONObject(querylist);// null;//(JSONObject)parser.parse(querylist); String statement = getqueryStatement(queries,type); String dbname = pluginoptions.getString("database"); boolean encrypted = pluginoptions.getBoolean("encrypted"); String inmode = pluginoptions.getString("mode"); sqliteDB sqlite = new sqliteDB(this.context,dbname); JSONObject result = sqlite.customExecute(statement,call); return result; } private String getqueryStatement(JSONObject queries,String type) throws JSONException { String statement = "BEGIN TRANSACTION;\n"; JSONArray tablelist = queries.names(); for (int i = 0; i < tablelist.length(); i++) { String tableName = tablelist.getString(i); switch (type) { case "Create": statement = statement + " CREATE TABLE IF NOT EXISTS " + tableName + " " + queries.get(tableName) + ";\n"; break; case "Alter": statement = statement + " ALTER TABLE " + tableName + " " + queries.get(tableName) + ";\n"; break; default: break; } } statement = statement + " COMMIT TRANSACTION;"; return tablelist.length() > 0 ? statement : null; } // ### createOrAlterTable End // ### formSchemaTosqlite Start private @NonNull Observable<String> formSchemaTosqlite(PluginCall call,IOException { JSONArray values = pluginoptions.getJSONArray("values"); String dbname = pluginoptions.getString("database"); boolean encrypted = pluginoptions.getBoolean("encrypted"); String inmode = pluginoptions.getString("mode"); sqliteDB2 sqlite = new sqliteDB2(this.context,dbname); for (int i = 0; i < values.length(); i++) { JSONObject table = (JSONObject) values.get(i); String lastSyncTime = table.getString("LastSyncTime"); String tableName = "FormSchema";// table.getString("tableName"); 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","FormSchemaSync"); wrapper.put("MessageKind","READ"); System.out.println("before rest"); String response = this.rest.post(apiUrl,wrapper.toString()); String jsonFormattedString = new JSONTokener(response).nextValue() .toString(); // System.out.println(response); JSONArray jsArray = new JSONArray(jsonFormattedString); List<String> queries = new ArrayList<String>(); for (int j = 0; j < jsArray.length(); j++) { String query = sqliteDB2.createPreparedStmtQuery( ((JSONObject) jsArray.get(j)),tableName); queries.add(query); } // sqlite.executeBatchsqliteQuery(queries,call); sqlite.executeBatchsqlitePreparedStatement(queries,call); } return Observable.fromArray(DEFAULT_RETURN); } // ### formSchemaTosqlite End 用于为查询方法创建语句和文字

createPreparedStmtQuery

错误

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) {
                //record.get(key).replace(/\'/g,'\'\'') ;
            }

            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();
    }

如何解决以上错误

请提供任何帮助。

谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。