Codename One Использование EasyThread.addGlobalErrorListener - PullRequest
1 голос
/ 26 мая 2020

Я не понял, как именно использовать addGlobalErrorListener(EasyThread.ErrorListener err).

Давайте go к моему коду в init():

        // Pro only feature (disabled)
        Log.bindCrashProtection(false);

        // Custom EDT error handling
        CN.addEdtErrorHandler(e -> {
            Log.p("\n\n--- EDT CRASH REPORT ---\n", Log.ERROR);
            Log.e((Throwable) e.getSource());
            Server.sendLogAsync();
            Dialog.show("EDT Exception", "Please be patient, report the following ERROR to the developers and then kill the app:\n\n" + e.getSource().toString(), null, null);
        });

        // Custom EasyThread error handling
        EasyThread.addGlobalErrorListener((t, c, e) -> {
            CN.callSerially(() -> {
                Log.p("\n\n--- Easy Thread CRASH REPORT ---\n", Log.ERROR);
                Log.p("Thead name: " + Thread.currentThread().getName());
                Log.e(e);
                Server.sendLogAsync();
                Dialog.show("EDT Exception", "Please be patient, report the following ERROR to the developers and then kill the app:\n\n" + e.getMessage(), null, null);
            });
        });

Код для тестирования EDT:

CN.callSerially(() -> {
            throw new IllegalStateException("Example of IllegalStateException in EDT");
        })

Код для тестирования EasyThread:

thread.run(() -> {
            throw new IllegalStateException("Example of IllegalStateException in EasyThread");
        });

Как вы можете догадаться, Server.sendLogAsync() - это моя собственная реализация Log.sendLogAsync(). Более того, я отключил защиту cra sh, потому что я хочу заставить тестеров убивать приложение при возникновении неуправляемого исключения.

Мои вопросы:

  1. Это код правильный? Я отмечаю, что он работает так же, как и я, за исключением Android и iOS, но Simulator перестает отвечать, когда возникает исключение внутри EasyThead. Более того, Симулятор не показывает диалоговое окно при обработке исключения EasyThread, в то время как Android и iOS показывают его.

  2. Каково использование EasyThread t и из <T> callback в качестве параметров метода onError(EasyThread t, T callback, Throwable error) из EasyThread.ErrorListener<T>? Что в данном случае T?

Спасибо за пояснения

1 Ответ

1 голос
/ 27 мая 2020

Имя потока неверно в коде обработки, вы бы всегда распечатывали EDT:

    // Custom EasyThread error handling
    EasyThread.addGlobalErrorListener((t, c, e) -> {
        String threadName = Thread.currentThread().getName();
        CN.callSerially(() -> {
            Log.p("\n\n--- Easy Thread CRASH REPORT ---\n", Log.ERROR);
            Log.p("Thead name: " + threadName);
            if(e != null) {
                  Log.e(e);
            }
            Server.sendLogAsync();
            Dialog.show("EDT Exception", "Please be patient, report the following ERROR to the developers and then kill the app:\n\n" + e.getMessage(), null, null);
        });
    });

Ошибка симулятора странная, я бы очень хотел знать, что происходит в этом случае . Если это воспроизводимо в отладчике, это, вероятно, будет легко отследить.

  • EasyThread дает вам прямую ссылку на пул потоков, который вызвал ошибку.

  • Обратный вызов - это, по сути, Runnable или аналогичный интерфейс, который мы использовали, например RunnableWithResult. Итак, T указывает тип интерфейса. Вы можете сделать это Object, чтобы все было в общем.

...