sync notifications to FX thread only in desktop app (#60)

daemon starting and stopping without exceptions
This commit is contained in:
woodser 2021-05-09 11:14:58 -04:00 committed by GitHub
parent fcdc627d00
commit 55f62f92dd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 94 additions and 100 deletions

View file

@ -15,8 +15,6 @@ import javax.inject.Inject;
import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.FutureCallback;
import javafx.application.Platform;
import java.io.File; import java.io.File;
import java.math.BigInteger; import java.math.BigInteger;
@ -81,11 +79,7 @@ public class XmrWalletService {
@Override @Override
public void onBalancesChanged(BigInteger newBalance, BigInteger newUnlockedBalance) { public void onBalancesChanged(BigInteger newBalance, BigInteger newUnlockedBalance) {
Platform.runLater(new Runnable() { // jni wallet runs on separate thread which cannot update fx notifyBalanceListeners();
@Override public void run() {
notifyBalanceListeners();
}
});
} }
}); });
}); });
@ -324,10 +318,10 @@ public class XmrWalletService {
threads.add(new Thread(new Runnable() { threads.add(new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
System.out.println("XmrWalletServie.shutDown() closing wallet within thread!!!");
System.out.println("Wallet balance: " + wallet.getBalance());
try { walletsSetup.getWalletConfig().closeWallet(openWallet); } try { walletsSetup.getWalletConfig().closeWallet(openWallet); }
catch (Exception e) { e.printStackTrace(); } catch (Exception e) {
e.printStackTrace(); // exception expected on shutdown when run as daemon TODO (woodser): detect if running as daemon
}
} }
})); }));
} }
@ -415,47 +409,27 @@ public class XmrWalletService {
@Override @Override
public void onSyncProgress(long height, long startHeight, long endHeight, double percentDone, String message) { public void onSyncProgress(long height, long startHeight, long endHeight, double percentDone, String message) {
Platform.runLater(new Runnable() { // jni wallet runs on separate thread which cannot update fx listener.onSyncProgress(height, startHeight, endHeight, percentDone, message);
@Override public void run() {
listener.onSyncProgress(height, startHeight, endHeight, percentDone, message);
}
});
} }
@Override @Override
public void onNewBlock(long height) { public void onNewBlock(long height) {
Platform.runLater(new Runnable() { // jni wallet runs on separate thread which cannot update fx listener.onNewBlock(height);
@Override public void run() {
listener.onNewBlock(height);
}
});
} }
@Override @Override
public void onBalancesChanged(BigInteger newBalance, BigInteger newUnlockedBalance) { public void onBalancesChanged(BigInteger newBalance, BigInteger newUnlockedBalance) {
Platform.runLater(new Runnable() { // jni wallet runs on separate thread which cannot update fx listener.onBalancesChanged(newBalance, newUnlockedBalance);
@Override public void run() {
listener.onBalancesChanged(newBalance, newUnlockedBalance);
}
});
} }
@Override @Override
public void onOutputReceived(MoneroOutputWallet output) { public void onOutputReceived(MoneroOutputWallet output) {
Platform.runLater(new Runnable() { // jni wallet runs on separate thread which cannot update fx listener.onOutputReceived(output);
@Override public void run() {
listener.onOutputReceived(output);
}
});
} }
@Override @Override
public void onOutputSpent(MoneroOutputWallet output) { public void onOutputSpent(MoneroOutputWallet output) {
Platform.runLater(new Runnable() { // jni wallet runs on separate thread which cannot update fx listener.onOutputSpent(output);
@Override public void run() {
listener.onOutputSpent(output);
}
});
} }
} }
} }

View file

@ -29,6 +29,8 @@ import org.fxmisc.easybind.EasyBind;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import javafx.application.Platform;
@Slf4j @Slf4j
public class BuyerSubView extends TradeSubView { public class BuyerSubView extends TradeSubView {
private TradeWizardItem step1; private TradeWizardItem step1;
@ -74,40 +76,44 @@ public class BuyerSubView extends TradeSubView {
protected void onViewStateChanged(PendingTradesViewModel.State viewState) { protected void onViewStateChanged(PendingTradesViewModel.State viewState) {
super.onViewStateChanged(viewState); super.onViewStateChanged(viewState);
if (viewState != null) { Platform.runLater(new Runnable() {
PendingTradesViewModel.BuyerState buyerState = (PendingTradesViewModel.BuyerState) viewState; @Override public void run() {
if (viewState != null) {
PendingTradesViewModel.BuyerState buyerState = (PendingTradesViewModel.BuyerState) viewState;
step1.setDisabled(); step1.setDisabled();
step2.setDisabled(); step2.setDisabled();
step3.setDisabled(); step3.setDisabled();
step4.setDisabled(); step4.setDisabled();
switch (buyerState) { switch (buyerState) {
case UNDEFINED: case UNDEFINED:
break; break;
case STEP1: case STEP1:
showItem(step1); showItem(step1);
break; break;
case STEP2: case STEP2:
step1.setCompleted(); step1.setCompleted();
showItem(step2); showItem(step2);
break; break;
case STEP3: case STEP3:
step1.setCompleted(); step1.setCompleted();
step2.setCompleted(); step2.setCompleted();
showItem(step3); showItem(step3);
break; break;
case STEP4: case STEP4:
step1.setCompleted(); step1.setCompleted();
step2.setCompleted(); step2.setCompleted();
step3.setCompleted(); step3.setCompleted();
showItem(step4); showItem(step4);
break; break;
default: default:
log.warn("unhandled buyerState " + buyerState); log.warn("unhandled buyerState " + buyerState);
break; break;
}
}
} }
} });
} }
} }

View file

@ -93,7 +93,7 @@ import javafx.geometry.Pos;
import org.fxmisc.easybind.EasyBind; import org.fxmisc.easybind.EasyBind;
import org.fxmisc.easybind.Subscription; import org.fxmisc.easybind.Subscription;
import javafx.application.Platform;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
@ -618,7 +618,11 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
if (item != null && !empty) { if (item != null && !empty) {
trade = item.getTrade(); trade = item.getTrade();
listener = (observable, oldValue, newValue) -> update(); listener = (observable, oldValue, newValue) -> Platform.runLater(new Runnable() {
@Override public void run() {
update();
}
});
trade.stateProperty().addListener(listener); trade.stateProperty().addListener(listener);
update(); update();
} else { } else {
@ -932,7 +936,11 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
super.updateItem(newItem, empty); super.updateItem(newItem, empty);
if (!empty && newItem != null) { if (!empty && newItem != null) {
trade = newItem.getTrade(); trade = newItem.getTrade();
listener = (observable, oldValue, newValue) -> update(); listener = (observable, oldValue, newValue) -> Platform.runLater(new Runnable() {
@Override public void run() {
update();
}
});
trade.stateProperty().addListener(listener); trade.stateProperty().addListener(listener);
update(); update();
} else { } else {

View file

@ -29,6 +29,8 @@ import org.fxmisc.easybind.EasyBind;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import javafx.application.Platform;
@Slf4j @Slf4j
public class SellerSubView extends TradeSubView { public class SellerSubView extends TradeSubView {
private TradeWizardItem step1; private TradeWizardItem step1;
@ -74,40 +76,44 @@ public class SellerSubView extends TradeSubView {
protected void onViewStateChanged(PendingTradesViewModel.State viewState) { protected void onViewStateChanged(PendingTradesViewModel.State viewState) {
super.onViewStateChanged(viewState); super.onViewStateChanged(viewState);
if (viewState != null) { Platform.runLater(new Runnable() {
PendingTradesViewModel.SellerState sellerState = (PendingTradesViewModel.SellerState) viewState; @Override public void run() {
if (viewState != null) {
PendingTradesViewModel.SellerState sellerState = (PendingTradesViewModel.SellerState) viewState;
step1.setDisabled(); step1.setDisabled();
step2.setDisabled(); step2.setDisabled();
step3.setDisabled(); step3.setDisabled();
step4.setDisabled(); step4.setDisabled();
switch (sellerState) { switch (sellerState) {
case UNDEFINED: case UNDEFINED:
break; break;
case STEP1: case STEP1:
showItem(step1); showItem(step1);
break; break;
case STEP2: case STEP2:
step1.setCompleted(); step1.setCompleted();
showItem(step2); showItem(step2);
break; break;
case STEP3: case STEP3:
step1.setCompleted(); step1.setCompleted();
step2.setCompleted(); step2.setCompleted();
showItem(step3); showItem(step3);
break; break;
case STEP4: case STEP4:
step1.setCompleted(); step1.setCompleted();
step2.setCompleted(); step2.setCompleted();
step3.setCompleted(); step3.setCompleted();
showItem(step4); showItem(step4);
break; break;
default: default:
log.warn("unhandled viewState " + sellerState); log.warn("unhandled viewState " + sellerState);
break; break;
}
}
} }
} });
} }
} }