NetBeans Wie referenziere ich einen Background task?

crasdf

Mitglied
Hallo alle miteinander!
Ich habn kleines Problem und hoffe mir kann jemand helfen.

Ich halte es in diesem Zusammenhang nicht unbedingt sinnvoll quellcode zu pasten, kann das auf nachfrage aber gerne noch tun.
kurz zusammengefasst:

-> hab eine gui application, die per bluetooth mit einem lego mindstorms robot kommuniziert.
fuer die bluetoothverbindung hab ich eine eigene klasse.
um das bluetooth zu verbinden, hab ich ne schaltflaeche auf der gui die diese klasse aufruft, und zwar in einer funktion, die das ganze im hintergrund laufen laesst. dazu wird die methode doinbackground aufgerufen
nun hab ich eine WEITERE fremde klasse die eingaben logisch verarbeitet und danach bluetooth befehle raus sendet. leider wird dort eine nullpointerexception geworfen was ich mir nur dadurch erklaeren kann, das das objekt vom typ bluetoothconnection einfach nicht richtig referenzierbar ist.

hoffe das reicht als beschreibung vorerst. wenns ne moeglichkeit gibt auf das ding zuzugreifen, dann wirds schon gehen

alle denkfehler vorbehalten
 
Zuletzt bearbeitet:

crasdf

Mitglied
ok, also folgendes
folgende klasse ist fuer die herstellung der bluetooth connnection verantwortlich
Java:
public class BTConnection {

    public StreamConnection sc;
    public NxtControl ctrl;
    
    /**
     * 
     * @param url the bluetooth url of the device we desire to connect to
     * @return returns true if the connection has been established successfully
     * @throws InterruptedException 
     */
    public Boolean connect(String url) throws InterruptedException{
        String connURL = "btspp://" + url + ":1";
        try {
            sc = (StreamConnection) Connector.open(connURL);
            ctrl = new NxtControl(sc.openOutputStream(), sc.openInputStream());
            System.out.println("CONNECTED TO NXT BRICK");
            DeviceInfo info = ctrl.getDeviceInfo();
            System.err.println("name : " + info.getName());
            System.err.println("address : " + info.getBlueToothAddress());
            System.err.println("signal strength = " + info.getBlueToothSignalStrength());
            System.err.println("free user FLASH = " + info.getFreeUserFlash());
            System.err.println("battery level = " + ctrl.getBatteryLevel() + "v");
            
        } catch (BluetoothConnectionException ex) {
            return false;
        } catch (IOException ex) {
            return false;
        }
        return true;
    }
    
}

Diese verbindung wird ueber einen button auf meiner gui als background task gestartet. der code dazu sieht folgendermassen aus:

Java:
public Task connectBT() {
        return new ConnectBTTask(getApplication());
    }

    private class ConnectBTTask extends org.jdesktop.application.Task<Object, Void> {
        
         ConnectBTTask(org.jdesktop.application.Application app) {
            // Runs on the EDT.  Copy GUI state that
            // doInBackground() depends on from parameters
            // to ConnectBTTask fields, here.
            
            super(app);
        }

        @Override
        protected Object doInBackground() throws IOException, InterruptedException {
            // Your Task's code here.  This method runs
            // on a background thread, so don't reference
            // the Swing GUI from here.
            return btcon.connect(btaddress);
        }

Anm.: code fuer "succeeded" methode ausgelassen da irrelevant. außerdem: den background task hab ich mir einfach von netbeans generieren lassen
okay, nun kommt noch eine dritte klasse hinzu, was die macht ist egal.
der ablauf ist der das ich ebenfalls einen button auf meiner gui betaetige, also muss ich code in die klasse fuer die gui schreiben...soweit.
der button ruft die dritte klasse auf. das heisst ich erstelle in der gui klasse eine instanz der neuen dritten klasse.
diese muss aber auch ueber die bluetooth verbindung verfügen können.
also hab ich in dieser dritten klasse ein objekt vom typ btconnection erstellt.
als naechstes ist die variable

Java:
public NxtControl ctrl;

in der klasse btconnection public, sie ist der tatsächliche roboter mit dem ich reden will.
also habe ich in der dritten klasse das obengenannte objekt über eine instanz von btconnection angesprochen.
das sieht in etwa so aus:

Java:
public BTConnection btcon1 = new BTConnection();
[...]
btcon1.ctrl.sendMessage(1, "r");

allerdings werden immer nullpointer exception geworfen wenn ich die letzte zeile code aufrufe.
und entweder bin ich bescheuert und schnalls nich ( was gut sein kann ) oder es ist so das ich auf die bluetooth connection selbst so nicht zugreifen kann weil sie in nem background thread laeuft.

boah ich hoff das ist verstaendlich
mfg
crasdf
 
Zuletzt bearbeitet:

crasdf

Mitglied
also es lag an meiner dummheit
der vollstaendigkeit halber die lösung:

ich hatte in der gui klasse ein objekt fuer die Bt verbindung, und in der dritten klasse eins. ich hab das aus der gui raus genommen und es nur in der dritten klasse gelassen
in der gui klasse wird dann ein objekt vom typ dritte klasse erstellt
die methode doinbackground bekommt folgenden code:
Java:
return dritteklasse.btcon1.connect(btaddress);

so werden BT und die dritte klasse zusammen im hintergrund ausgefuehrt, genau wie ich es wollte

sorry fuer doppelpost
 

Ähnliche Java Themen


Oben