2016-09-21 2 views
0

Ich habe einen Teil des Codes, in dem ich zuerst setText, dann eine Toast machen und danach versuche ich über Bluetooth zu verbinden. Das Problem ist, dass meine setText und Toasts erst angezeigt werden, nachdem die Verbindung hergestellt wurde.Toasts werden nicht gleichzeitig angezeigt

Ich habe versucht, Log.i statt Toasts setzen und sie wurden gleichzeitig angezeigt.

Kann mir jemand erklären, warum und wie Toasts gleichzeitig zu machen?

Code:

........ 

else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {  
    tvDevices.setText(""); 
    Toast.makeText(getApplicationContext(), "Lost connection!", Toast.LENGTH_SHORT).show(); 
    connect(btDevice, ConstantsVariables.reconnectionAttempts); 
} 

public void connect(BluetoothDevice bt, int attempts){ 
    Toast.makeText(getApplicationContext(), "Trying to connect...", Toast.LENGTH_SHORT).show(); 
    if(attempts > 0){ 
     for(int i = 1; i <= ConstantsVariables.reconnectionAttempts; i++){ 
      ConnectThread thread = new ConnectThread(bt); 
      boolean connectVar = thread.connect(); 
      if(connectVar){ 
       break; 
      } 
     } 
    } 
} 

....... 

public boolean connect() { 
    BA.cancelDiscovery(); 
    try { 
     mSocket.connect(); 
    } catch (IOException e) { 
     Log.d("CONNECTTHREAD","Could not connect: " + e.toString()); 
     try { 
      mSocket.close(); 
     } catch (IOException exception){} 
     return false; 
    } 
    return true; 
} 

Antwort

0

Es ist möglich, dass Sie die UI-Thread sind blockiert, während Verbindung versucht wird. Versuchen Sie, den Verbindungscode in einen Hintergrundthread oder eine AsyncTask zu verschieben, und bearbeiten Sie die UI-Änderungen in den Callbacks der AsyncTask.

Edit: Auch der Kontext getApplicationContext() an Toast übergeben ist mehrdeutig. Bist du in einer Aktivität? In diesem Fall sollte es einfach auf den Kontext der Aktivität zeigen, d. H. this und nicht den Kontext der Anwendung

+0

Ok, ich verstand über 'getApplicationContext()'. Aber kannst du bitte erklären, was Hintergrund-Thread ist und wie man es macht? – Tryam

+0

Ich habe verstanden, dass ich eine Konstruktion wie 'AsyncTask.execute (new Runnable() { @Override öffentlichen void run() {} }) machen sollte;' aber wo man es und was hineinlegen? Vielen Dank! – Tryam

+0

Sie können entweder einen AsyncTask- oder einen Hintergrund-Thread mit Handler verwenden, nicht beide zusammen. Das einfachste Beispiel für die Verwendung ist entweder http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html#example –