]> git.basschouten.com Git - openhab-addons.git/commitdiff
[hpprinter] Prevent "handler disposed" warnings on shutdown (#10549)
authorAndrew Fiddian-Green <software@whitebear.ch>
Sun, 25 Apr 2021 09:19:39 +0000 (10:19 +0100)
committerGitHub <noreply@github.com>
Sun, 25 Apr 2021 09:19:39 +0000 (11:19 +0200)
Signed-off-by: Andrew Fiddian-Green <software@whitebear.ch>
bundles/org.openhab.binding.hpprinter/src/main/java/org/openhab/binding/hpprinter/internal/HPPrinterBinder.java
bundles/org.openhab.binding.hpprinter/src/main/java/org/openhab/binding/hpprinter/internal/HPPrinterHandler.java

index 5cfe51dfe745dab3119e1c441b4a3cea420e77cf..0f76ddd35d72d118f4cefebaaaed03b0e24b6c6e 100644 (file)
@@ -75,9 +75,11 @@ public class HPPrinterBinder {
     private @Nullable ScheduledFuture<?> usageScheduler;
     private @Nullable ScheduledFuture<?> offlineScheduler;
 
+    private boolean handlerDisposed;
+
     /**
      * Creates a new HP Printer Binder object
-     * 
+     *
      * @param handler {HPPrinterBinderEvent} The Event handler for the binder.
      * @param httpClient {HttpClient} The HttpClient object to use to perform HTTP
      *            requests.
@@ -95,6 +97,7 @@ public class HPPrinterBinder {
             throw new IllegalStateException("ip-address should have been validated already and may not be empty.");
         }
         printerClient = new HPWebServerClient(httpClient, ipAddress);
+        handlerDisposed = false;
     }
 
     public void retrieveProperties() {
@@ -107,7 +110,7 @@ public class HPPrinterBinder {
 
     public synchronized void channelsChanged() {
         logger.trace("Channels have been changed");
-        close();
+        closeInternal();
         open();
     }
 
@@ -548,9 +551,20 @@ public class HPPrinterBinder {
     }
 
     /**
-     * Close the connection to the Embedded Web Server
+     * Public method to close the connection to the Embedded Web Server
+     *
+     * Set handlerDisposed to prevent call-backs to the handler after it has been disposed
+     * Then call the closeinternal() method
      */
     public void close() {
+        handlerDisposed = true;
+        closeInternal();
+    }
+
+    /**
+     * Private (internal) method to close the connection to the Embedded Web Server
+     */
+    private void closeInternal() {
         stopBackgroundSchedules();
 
         final ScheduledFuture<?> localOfflineScheduler = offlineScheduler;
@@ -564,10 +578,10 @@ public class HPPrinterBinder {
     /**
      * The device has gone offline
      */
-    public void goneOffline() {
+    private void goneOffline() {
         handler.updateStatus(ThingStatus.OFFLINE);
 
-        close();
+        closeInternal();
         runOfflineScheduler();
     }
 
@@ -615,6 +629,9 @@ public class HPPrinterBinder {
     private void checkScannerStatus() {
         HPServerResult<HPScannerStatus> result = printerClient.getScannerStatus();
 
+        if (handlerDisposed) {
+            return;
+        }
         if (result.getStatus() == RequestStatus.SUCCESS) {
             handler.updateState(CGROUP_STATUS, CHANNEL_SCANNER_STATUS,
                     new StringType(result.getData().getScannerStatus()));
@@ -628,6 +645,9 @@ public class HPPrinterBinder {
     private void checkStatus() {
         HPServerResult<HPStatus> result = printerClient.getStatus();
 
+        if (handlerDisposed) {
+            return;
+        }
         if (result.getStatus() == RequestStatus.SUCCESS) {
             handler.updateState(CGROUP_STATUS, CHANNEL_STATUS, new StringType(result.getData().getPrinterStatus()));
             handler.updateState(CGROUP_STATUS, CHANNEL_TRAYEMPTYOROPEN,
@@ -648,6 +668,9 @@ public class HPPrinterBinder {
     private void checkUsage() {
         HPServerResult<HPUsage> result = printerClient.getUsage();
 
+        if (handlerDisposed) {
+            return;
+        }
         if (result.getStatus() == RequestStatus.SUCCESS) {
             // Inks
             handler.updateState(CGROUP_INK, CHANNEL_BLACK_LEVEL,
@@ -774,6 +797,9 @@ public class HPPrinterBinder {
     private void checkOnline() {
         HPServerResult<HPStatus> result = printerClient.getStatus();
 
+        if (handlerDisposed) {
+            return;
+        }
         if (result.getStatus() == RequestStatus.SUCCESS) {
             goneOnline();
         } else if (result.getStatus() == RequestStatus.TIMEOUT) {
index e1a6dd6fdc24ec9ae6dd0e7f78b3bb18ea9e0cb5..3d90fbd2787dba5266c9f9b99244cccb1cd86841 100644 (file)
@@ -12,7 +12,7 @@
  */
 package org.openhab.binding.hpprinter.internal;
 
-import static org.openhab.binding.hpprinter.internal.HPPrinterBindingConstants.*;
+import static org.openhab.binding.hpprinter.internal.HPPrinterBindingConstants.CGROUP_STATUS;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -65,6 +65,13 @@ public class HPPrinterHandler extends BaseThingHandler {
 
     @Override
     public void initialize() {
+        scheduler.submit(() -> initializeScheduled());
+    }
+
+    /**
+     * Scheduled initialization task which will be executed on a separate thread
+     */
+    private void initializeScheduled() {
         final HPPrinterConfiguration config = getConfigAs(HPPrinterConfiguration.class);
 
         if (!"".equals(config.ipAddress)) {
@@ -96,6 +103,7 @@ public class HPPrinterHandler extends BaseThingHandler {
         return false;
     }
 
+    @Override
     protected void updateStatus(final ThingStatus status) {
         super.updateStatus(status);
     }
@@ -116,6 +124,7 @@ public class HPPrinterHandler extends BaseThingHandler {
         }
     }
 
+    @Override
     protected void updateStatus(final ThingStatus status, final ThingStatusDetail thingStatusDetail,
             @Nullable final String message) {
         super.updateStatus(status, thingStatusDetail, message);
@@ -135,14 +144,17 @@ public class HPPrinterHandler extends BaseThingHandler {
         updateThing(editThing().withChannels(thingChannels).build());
     }
 
+    @Override
     protected ThingBuilder editThing() {
         return super.editThing();
     }
 
+    @Override
     protected @Nullable ThingHandlerCallback getCallback() {
         return super.getCallback();
     }
 
+    @Override
     protected void updateProperties(final Map<String, String> properties) {
         super.updateProperties(properties);
     }