2017-12-11 12 views
0

안녕하세요,
저는 한 장치가 게임을위한 로비를 호스트하도록 (프로그래밍 중이십니까)
인 로비 장치를 프로그래밍하고 있습니다. 하나에 가입 할 수 있습니다.
현재 한 장치가 호스트에 참가를 요청하고 호스트가 해당 장치를 플레이어 목록에 저장하고 화면에 표시하고 정보를 다시 보내는 시점에 있습니다.AsyncTask onProgressUpdate가 UI 스레드의 UI를 즉시 변경하지 않습니다.

호스트 작업을 처리하는 비동기 스레드이므로 "Join-Host"메시지를 받으면 publishProgress-Method를 통해 호출합니다 (메인 스레드로 되돌아갑니다). UI 내의 Textfield를 변경하는 클래스. 결과

protected void onProgressUpdate(ArrayList<String>... values){ 
    if(msg.equals("Join-Host")){ 
     System.out.println("Gets Called"); 
     owner.add_Player(recvpacket.getAddress().toString()); 
    } 

} 

protected ArrayList<String> doInBackground(String... IP){ 
    DatagramSocket c = null; 
    try{ 
     //Setup Datagram Server 
     c = new DatagramSocket(8888, InetAddress.getByName("0.0.0.0")); 
     c.setBroadcast(true); 
     while(!cancel) { 
      //Receive Packets 
      byte[] recvBuffer = new byte[15000]; 
      recvpacket = new DatagramPacket(recvBuffer,recvBuffer.length); 
      c.receive(recvpacket); 
      //Verify Packet 
      msg = new String(recvpacket.getData()).trim(); 
      System.out.println("Received Packet with message: " + msg); 
      if(msg.equals("Find-Hosts")){ 
       byte[] sendData = (Build.MODEL).getBytes(); 
       DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,recvpacket.getAddress(),recvpacket.getPort()); 
       c.send(sendPacket); 
      }else{ 
       publishProgress(null); 
      } 




    } 




에서는, 제 1 단계, 난이 메시지를 수신 한 후, 직접 호스트 장치에 표시되는 결합 장치를 얻고 자하는 것이다. 뭔가 다른 내가 새 장치를 표시 할 인터페이스를 통해라는 메인 클래스에서 명령을 실행하기 위해 doInBackground 방법에 일어날 때까지


그래서 모든게 작품,하지만 즉시 걸립니다.

이 문제를 해결하는 방법에 대한 제안 사항이 있습니까?
도움 주셔서 감사합니다.

답변

0

Android가 UI를 즉시 업데이트하지 않습니다. 요소를 변경하면 Android가 UI를 다시 그릴 때까지 몇 초 또는 더 오래 걸릴 수 있습니다.

그러나 다시 그리려는 요소 (보기)에서 invalidate() 메서드를 호출하여 강제로 다시 그릴 수 있습니다. 귀하의 경우이 요소를 변경 한 직후 것입니다. 그때 당신의 변화는 당신의 장치가 그 순간에 얼마나 바쁠 지에 따라 거의 즉각적으로 보일 것입니다.

+0

또한 내 thougths 중 하나 였지만, UI 물건을 변경하기 전에 메서드에서 System.out.println 명령을 사용하면 새 패킷이 소켓에서 수신 될 때까지 출력되지 않습니다. 그래서 뭔가가 doInBackground에서 일어나기 전에 전체 메서드가 호출되지 않는다고 생각합니다. –