2014-01-31 4 views
0

Недавно я написал небольшое приложение для Android, чтобы отправлять и получать сообщения UDP через локальную сеть.
У меня есть поток приемника UDP, который запускается для прослушивания UDP-пакетов, то, что я хочу, это кнопка, которая станет включенной в пользовательском интерфейсе, когда пакет будет принят, который содержит определенную строку данных. Я знаю, что это нужно делать с обработчиком, проблема в том, что у меня мало знаний о потоках и очень мало информации о обработчиках.
кто-нибудь сможет пролить свет на то, как обработчик может быть помещен в мой код?
благодаря

код:
android threading and handler - Изменение объектов пользовательского интерфейса из фоновой темы

public void startUDPlistener() { 

    // Creates the listener thread 
    LISTEN = true; 
    Thread listenThread = new Thread(new Runnable() { 

     @Override 
     public void run() { 

      try { 

       Log.i(LOG, "Listener started!"); 
       DatagramSocket socket = new DatagramSocket(BROADCASTPORT); 
       socket.setSoTimeout(1500); 
       byte[] buffer = new byte[BUFFERSIZE]; 
       DatagramPacket packet = new DatagramPacket(buffer, BUFFERSIZE); 


       while(LISTEN) { 

        try { 

         Log.i(LOG, "Listening for packets"); 
         socket.receive(packet); 
         String data = new String(buffer, 0, packet.getLength()); 
         Log.i(LOG, "UDP packet received from "+ packet.getAddress() +" packet contents: " + data); 




        } 
        catch(IOException e) { 

         Log.e(LOG, "IOException in Listener " + e); 
        } 
       } 

       Log.i(LOG, "Listener ending"); 
       socket.disconnect(); 
       socket.close(); 
       return; 
      } 

      catch(SocketException e) { 

       Log.e(LOG, "SocketException in Listener " + e); 

      } 
     } 
    }); 

    listenThread.start(); 

} 
+1

Простой альтернативой использованию обработчика будет использование метода runOnUiThread (...) ': http://stackoverflow.com/questions/11140285/how-to-use-runonuithread – Yjay

ответ

1

Вы в основном просто добавить один и отправить либо Message или Runnable.

private final Handler mUiThreadHandler = new Handler(Looper.getMainLooper()); 

void fromAnyThread() { 
    final String importantDataFromBackGroundThread = "!!!"; 
    mUiThreadHandler.post(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("Hi from Ui Thread:" + importantDataFromBackGroundThread); 
     } 
    }); 
} 

The Handler обрабатывает все сообщения/runnables в потоке он работает. Если вы укажете Looper.getMainLooper() вы гарантированно, что это основной поток.

Смежные вопросы