diff --git a/bundles/org.openhab.binding.hpprinter/src/main/java/org/openhab/binding/hpprinter/internal/HPPrinterBinder.java b/bundles/org.openhab.binding.hpprinter/src/main/java/org/openhab/binding/hpprinter/internal/HPPrinterBinder.java index 5cfe51dfe..0f76ddd35 100644 --- a/bundles/org.openhab.binding.hpprinter/src/main/java/org/openhab/binding/hpprinter/internal/HPPrinterBinder.java +++ b/bundles/org.openhab.binding.hpprinter/src/main/java/org/openhab/binding/hpprinter/internal/HPPrinterBinder.java @@ -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 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 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 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 result = printerClient.getStatus(); + if (handlerDisposed) { + return; + } if (result.getStatus() == RequestStatus.SUCCESS) { goneOnline(); } else if (result.getStatus() == RequestStatus.TIMEOUT) { diff --git a/bundles/org.openhab.binding.hpprinter/src/main/java/org/openhab/binding/hpprinter/internal/HPPrinterHandler.java b/bundles/org.openhab.binding.hpprinter/src/main/java/org/openhab/binding/hpprinter/internal/HPPrinterHandler.java index e1a6dd6fd..3d90fbd27 100644 --- a/bundles/org.openhab.binding.hpprinter/src/main/java/org/openhab/binding/hpprinter/internal/HPPrinterHandler.java +++ b/bundles/org.openhab.binding.hpprinter/src/main/java/org/openhab/binding/hpprinter/internal/HPPrinterHandler.java @@ -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 properties) { super.updateProperties(properties); }