Codenameone: как остановить запрос XFClient findAndWait при возникновении сетевого исключения, чтобы вызывающий поток мог продолжить работу? - PullRequest
1 голос
/ 07 мая 2020

Мое приложение CN1 использует XFClient для связи с базой данных mySQL на сервере, на котором работает Xataface. Поток таймера вызывает метод findAndWait XFClient и затем засыпает 1 секунду перед повторением. Он работает хорошо в 99 +% случаев, но иногда приложение сталкивается с сетевой проблемой (Bad Gateway, ConnectionExceptions, SocketTimeOutException и т. Д. c.) И перестает взаимодействовать с сервером, потому что findAndWait продолжает ждать, несмотря на исключение. Есть ли способ для findAndWait прекратить ожидание при возникновении исключения?

Вот что я пробовал до сих пор:

  1. принять ошибку. Это подавляет сообщение об ошибке пользователю, но findAndWait продолжает ждать
  2. Request.setTimeout (5000), чтобы выйти через 5 секунд (на основе SocketTimeoutException в сборке CodeNameOne на Android устройстве ) . Нет эффекта. FindAndWait продолжает ждать. Пробовал это в NetworkManager и на уровне запроса.
  3. В handleException для NetworkManager добавлен код ниже (на основе https://github.com/codenameone/CodenameOne/issues/733). Он скомпилирован и запущен, но findAndWait продолжал ждать.

        NetworkManager.getInstance().addErrorListener(new ActionListener() {
    
            @Override
            public void actionPerformed(ActionEvent evt) {
                System.out.println("got a network error.  will kill the connect request and consume it.");
                if (theXFClient.getcRMP() != null) {
                NetworkManager.getInstance().killAndWait(theXFClient.getcRMP());
                }
                evt.consume();
            }
        });
    

Я запускаю это на симуляторе, запускаю приложение и затем вызываю проблему, отключив сетевое соединение в меню симулятора . Я надеялся, что поток таймера продолжится, когда я снова включу сетевое соединение, но он все еще остановлен.

BTW - Когда приложение приостанавливается и возобновляется через меню симулятора (и на реальных устройствах), таймер возобновляется с того места, где он остановился. Надеемся, что мы сможем найти способ сделать это и при сбоях сети.

Спасибо, Майк

1 Ответ

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

Я только что добавил поддержку тайм-аута и тайм-аута чтения, которые можно установить как для класса XFClient, так и для класса XFQuery. Если и XFClient, и XFQuery для определенного запроса указывают тайм-аут, тогда тайм-аут XFQuery будет иметь прецедент.

Это обновление скоро будет в настройках Codename One, но вы можете загрузить эту новую сборку прямо сейчас из здесь

...