2017-07-30 1 views
0

J'essaye d'exécuter une connexion UDP avec un équipement externe. Je veux qu'il envoie un message à l'équipement toutes les 3 secondes et lire la réponse. J'ai créé 3 classes: principal, expéditeur et recevoir. J'ouvre un Runnable à la fois pour l'expéditeur et le destinataire et je les laisse dormir pendant 3 secondes avant de continuer. Mon problème est, quand j'appuie sur le bouton sur l'écran, les messages sont envoyés et reçus, mais ils ne sont pas mis à jour sur mon écran parce que la ligne de mise à jour n'est pas dans une boucle. Comment puis-je le dire pour mettre à jour l'écran toutes les 3 secondes? le code pour lire le message et l'afficher, est le suivant:Mise à jour de l'interface utilisateur multi-thread Android

textViewState.setText (udpReceive.receivedMessage);

code

public class MainActivity extends AppCompatActivity { 

public static TextView textViewState; 
public static Context context; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    textViewState = (TextView) findViewById(R.id.textView); 
    context = getApplicationContext(); 

} 

public void buttonConnect(View v) { 

    (new Thread(new udpSender())).start(); 

    (new Thread(new udpReceive())).start(); 

    textViewState.setText(udpReceive.receivedMessage); 

} 


} 

classe pour envoyer un message:

public class udpSender implements Runnable { 


public void run() { 

    while (true) { 

     String messageStr = "Hello Android!"; 
     int server_port = 8888; 
     DatagramSocket s = null; 
     try { 
      s = new DatagramSocket(); 
     } catch (SocketException e) { 
      e.printStackTrace(); 
     } 
     InetAddress local = null; 
     try { 
      local = InetAddress.getByName("192.168.43.159"); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } 
     int msg_length = messageStr.length(); 
     byte[] message = messageStr.getBytes(); 

     DatagramPacket p = new DatagramPacket(message, msg_length, local, server_port); 
     try { 
      s.send(p); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try { 
      Thread.sleep(3000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

    } 
} 
} 

classe pour recevoir un message de udp

public class udpReceive implements Runnable { 

private static final int MAX_UDP_DATAGRAM_LEN = 100; 
private static final int UDP_SERVER_PORT = 8888; 
public static String receivedMessage; 

public void run() { 


    while (true) { 
     String message; 
     byte[] lmessage = null; 
     lmessage = new byte[MAX_UDP_DATAGRAM_LEN]; 
     DatagramPacket packet = null; 

     DatagramSocket socket = null; 
     try { 
      packet = new DatagramPacket(lmessage, lmessage.length); 
      socket = new DatagramSocket(UDP_SERVER_PORT); 
      socket.receive(packet); 
      message = new String(lmessage, 0, packet.getLength()); 
      receivedMessage = message; 
     } catch (SocketException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (socket != null) { 
       socket.close(); 
      } 
     } 
     try { 
      Thread.sleep(3000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
} 
+0

utiliser Handler à g o retour au fil principal et ensuite vous pouvez mettre à jour votre TextView – MohammedAlSafwan

Répondre

0

J'ai trouvé une solution basée sur vos deux réponses :) Thank you

classe MainActivity:

public static Handler UIHandler; 

static { 
    UIHandler = new Handler(Looper.getMainLooper()); 
} 

public static void runOnUI(Runnable runnable) { 
    UIHandler.post(runnable); 
} 

recevoir la classe

MainActivity.runOnUI(new Runnable() { 
    public void run() { 
     MainActivity.textViewState.setText(message_received); 
    } 
}); 
0

Dans une classe qui est dans un autre thread, essayer de faire cela

Handler handler = new Handler(getActivity().getMainLooper()); 

handler.post(new Runnable(){ 
     // your TextView goes here 
}) 
0

Seul le thread d'interface utilisateur (thread principal) peut accéder à des éléments de l'interface utilisateur

// Your message receiving class 
... 
message = new String(lmessage, 0, packet.getLength()); 
final String message_received = new String(lmessage, 0, packet.getLength()); 
... 

MainActivity.context.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     MainActivity.textViewState.setText(message_received); 
    } 
}); 
...