2016-12-01 6 views
0

Ich habe eine Bluetoothscanner-Klasse als Singleton erstellt, so kann ich während meiner gesamten Anwendung mit dem Bluetoothscanner kommunizieren.Singleton behält keine geänderten Eigenschaften

Ich dachte, beim Festlegen einer Eigenschaft eines Singleton würde es seinen Wert bleiben, anscheinend nicht? oder mache ich etwas falsch?

Das ist mein Singleton:

public sealed class BluetoothScanner 
{ 
    private static readonly BluetoothScanner instance = new BluetoothScanner(); 
    public static BluetoothScanner Instance => BluetoothScanner.instance; 

    public bool IsConnected { get; set; } 

    private BluetoothScanner() 
    { 
     this.Adapter = BluetoothAdapter.DefaultAdapter; 
    } 

    public bool Connect() 
    { 
     var bondedDevices = this.Adapter.BondedDevices; 
     if (!bondedDevices.Any()) 
     { 
      this.SendToastMessage("No paired devices found"); 
      this.IsConnected = false; 
     } 
     if (this.socket.ConnectAsync().IsCompleted) 
     { 
      this.SendToastMessage($"Connected to Device {this.device.Name}"); 
      this.IsConnected = true; 
     } 
     return this.IsConnected; 
    } 
} 

Die Connect Verfahren wie dieses in meinem Fragment genannt wird:

public class ConditionSearchFragment : BaseTitledFragment<ConditionSearchViewModel> 
{ 
    protected override int FragmentId => Resource.Layout.fragment_condition_search; 

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     if (!BluetoothScanner.Instance.IsConnected) 
     { 
      BluetoothScanner.Instance.Connect(); 
     } 
     BluetoothScanner.Instance.SendKey += this.OnSendKey; 
     BluetoothScanner.Instance.SendToast += this.OnSendToast; 
     return base.OnCreateView(inflater, container, savedInstanceState); 
    } 
} 

ich auf dem ersten Mal dachte ich es die Singleton initialisieren und dann wiederverwenden wieder und wieder. Aparently bei der Rückkehr in diese Klasse und OnCreateView() heißt es erneut heißt es, es ist nicht verbunden und versucht so mit der connect-Methode zu verbinden, so dass eine Java.IO.Exception als es bereits einen offenen Socket.

Was mache ich gerade falsch?

+0

Haben Sie Ihrem Manifest HaroldSer

+0

@ScottS nein ich wusste nicht einmal ich musste es tun? Was würde ich hinzufügen, wenn meine Klasse in diesem Namensraum lebt: 'Some.Fancy.Namespace.Droid.Bluetooth.BluetoothScanner' – Baklap4

+0

Ihre Singleton-Implementierung sieht korrekt aus. Vielleicht gibt es dort einige Android-spezifische. Vielleicht werden Instanzen gesammelt, wenn Sie Aktivitäten über eine Absicht ändern (weil sie auf Betriebssystemebene ausgeführt wird und dazu führen kann, dass die Mono-Laufzeitumgebung geschlossen wird). –

Antwort

1

Ihr Singleton funktioniert wie erwartet. Die einzige Sache, die ich finden kann, ist, dass Ihr Aufruf zu connect() in irgendeiner Weise fehlschlägt, so dass das IsConnected nicht auf wahr gesetzt wird. Test dieser Linie für den Rückgabewert:

BluetoothScanner.Instance.Connect(); 

Ich vermute, dass diese Linie:

if (this.socket.ConnectAsync().IsCompleted) 

gibt eine falsche IsConnected so verlassen auf false Standard.

+0

Hmmm wäre komisch, wenn es fehlschlägt .. da meine Bluetooth-Geräte in der Lage sind sich zu verbinden, nachdem base.oncreateview aufgerufen wurde. Auch wenn es eine asynchrone Methode ist und nicht erwartet wird, könnte es in der Tat sein. Ich werde morgen testen;) – Baklap4

+0

Da es async lief, wurde es vom Hauptthread nicht verfolgt und während es nicht erwartet wurde, war es nie fertig zu überprüfen und IsConnected nicht zu setzen. Wie sollte man darauf warten, dass es aufhört? Im Moment verwende ich die 'this.socket.Connect()' Methode, die blockiert ... – Baklap4

Verwandte Themen