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 javafx.application.Platform;
import java.io.File;
import java.math.BigInteger;
@ -81,11 +79,7 @@ public class XmrWalletService {
@Override
public void onBalancesChanged(BigInteger newBalance, BigInteger newUnlockedBalance) {
Platform.runLater(new Runnable() { // jni wallet runs on separate thread which cannot update fx
@Override public void run() {
notifyBalanceListeners();
}
});
notifyBalanceListeners();
}
});
});
@ -324,10 +318,10 @@ public class XmrWalletService {
threads.add(new Thread(new Runnable() {
@Override
public void run() {
System.out.println("XmrWalletServie.shutDown() closing wallet within thread!!!");
System.out.println("Wallet balance: " + wallet.getBalance());
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
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
@Override public void run() {
listener.onSyncProgress(height, startHeight, endHeight, percentDone, message);
}
});
listener.onSyncProgress(height, startHeight, endHeight, percentDone, message);
}
@Override
public void onNewBlock(long height) {
Platform.runLater(new Runnable() { // jni wallet runs on separate thread which cannot update fx
@Override public void run() {
listener.onNewBlock(height);
}
});
listener.onNewBlock(height);
}
@Override
public void onBalancesChanged(BigInteger newBalance, BigInteger newUnlockedBalance) {
Platform.runLater(new Runnable() { // jni wallet runs on separate thread which cannot update fx
@Override public void run() {
listener.onBalancesChanged(newBalance, newUnlockedBalance);
}
});
listener.onBalancesChanged(newBalance, newUnlockedBalance);
}
@Override
public void onOutputReceived(MoneroOutputWallet output) {
Platform.runLater(new Runnable() { // jni wallet runs on separate thread which cannot update fx
@Override public void run() {
listener.onOutputReceived(output);
}
});
listener.onOutputReceived(output);
}
@Override
public void onOutputSpent(MoneroOutputWallet output) {
Platform.runLater(new Runnable() { // jni wallet runs on separate thread which cannot update fx
@Override public void run() {
listener.onOutputSpent(output);
}
});
listener.onOutputSpent(output);
}
}
}

View File

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

View File

@ -93,7 +93,7 @@ import javafx.geometry.Pos;
import org.fxmisc.easybind.EasyBind;
import org.fxmisc.easybind.Subscription;
import javafx.application.Platform;
import javafx.beans.binding.Bindings;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.beans.value.ChangeListener;
@ -618,7 +618,11 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
if (item != null && !empty) {
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);
update();
} else {
@ -932,7 +936,11 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
super.updateItem(newItem, empty);
if (!empty && newItem != null) {
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);
update();
} else {

View File

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