2017-07-30 16 views
0

外部機器とのUDP接続を実行しようとしています。 3秒ごとに機器にメッセージを送り、その応答を読んでほしい。 main、sender、receiveという3つのクラスを作成しました。 送信者と受信者の両方に対してRunnableを開き、3秒間スリープさせてから続行します。AndroidマルチスレッドUIアップデート

私の問題は、画面上のボタンを押すと、メッセージが送受信されますが、更新行がループしていないため、画面上で更新されません。どのように3秒ごとに画面を更新するように指示するのですか?メッセージを読み込んで表示するコードは次のとおりです。

textViewState.setText(udpReceive.receivedMessage);メッセージ送信するために

コード

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); 

} 


} 

クラス:

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(); 
     } 

    } 
} 
} 

クラスが別のスレッドにある任意のクラスでは、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

Handler to g oメインスレッドに戻り、TextViewを更新することができます – MohammedAlSafwan

答えて

0

にアクセスすることができ、私は

MainActivityクラスをいただきありがとうございます:)あなたの答えの両方に基づいて解決策を見つけた:

public static Handler UIHandler; 

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

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

クラスを受け取ります

0

からメッセージを受信し、これをやってみてください

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

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

のみUIスレッド(メインスレッド)がUI要素に

// 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); 
    } 
}); 
... 
関連する問題