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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...