2012-07-31 83 views
0

我在我的onCreate方法中創建線程。我通過線程上的udp接收數據。由於某種原因,它不起作用。線程不是在android中創建

private void UdpThread() { 
// server will listen to one client 
    try 
    { 
     Thread udpServerThread = new Thread() 
     { 
      @Override 
      public void run() 
      {  
       Log.i("rrr","receivePacket3"); 
       try 
       { 
        while(true) 
        { 
         sleep(1000); 
        Log.i("rrr","receivePacket2"); 
        String[] recieved = null; 

        DatagramSocket clientSocket = null; 
        InetAddress IPAddress = null; 
        try { 

         IPAddress = InetAddress.getByName("localhost"); 
        } catch (UnknownHostException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        byte[] receiveData = new byte[1500]; 
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
        try { 
         clientSocket = new DatagramSocket(8086); 
         Log.i("rrr","receivePacket"); 
         clientSocket.receive(receivePacket); 

         Log.i("rrr","receivePacket1"); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        modifiedSentence = new String(receivePacket.getData()); 
        System.out.println("in client receive:" + modifiedSentence); 

        Log.i("Received data",modifiedSentence); 
        clientSocket.close(); 

        modifiedSentence = modifiedSentence.trim(); 
        Log.i("Received data",modifiedSentence); 
        } 
       } catch (Exception e){ 
        Log.e("UDP", "S: Error", e); 
       } 
      } 
     }; 
     udpServerThread.start(); 
     //udpServerThread.setPriority(Thread.MAX_PRIORITY); 

     Toast.makeText(this,modifiedSentence,Toast.LENGTH_LONG).show(); 

    }catch (Exception e) { 
     // TODO: handle exception 
     Log.e("eeeee",""+e); 
     e.printStackTrace(); 
    } 
} 

我該怎麼做,當控制不立即從thread.and返回,並等待,直到數據沒有收到。

+0

你是什麼意思*「線程沒有創建和控制跳轉到敬酒」*? 'udpServerThread.start();'將啓動線程並立即返回,而啓動的線程並行運行,並且您的代碼將繼續執行到下一行。 – assylias 2012-07-31 11:13:11

+0

問題不完整(我只是修復了語言,拼寫和格式),您還需要共享日誌。 – Siddharth 2012-07-31 11:13:51

+0

@assylias然後爲什麼我沒有通過udp獲取數據,我已經在線程中編碼。 – Rcp 2012-07-31 11:18:22

回答

0

與第二個線程中的主線程一起使用,我們必須在android中使用處理程序... ex。

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     new Thread(new Runnable() { 
      public void run() { 
      try{ 
       Message myMessage = new Message(); 
       myMessage.obj = "SEND ANY DATA"; 
      } 
      catch (JSONException e) { 
      e.printStackTrace(); 
      } 

      }).start(); 

和處理程序.....

private Handler finishHandler1 = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      // do the UI things.. 

     } 
    }; 
+0

我已經使用處理程序,但它給了我一個例外。 – Rcp 2012-07-31 11:40:40

+0

什麼異常?你可以顯示你的代碼和logcat的例外..而不是這個Log.e(「UDP」,「S:錯誤」,電子);寫Log.e(「UDP」,「S:Error」+ e); – mainu 2012-08-03 06:22:37

0

你必須創建和初始化Handler對象,做它主要還是UI線程。之後,您將能夠將消息和Runnables從工作線程發佈到處理程序。

或者,你可以使用

Activity.runOnUiThread(Runnable) 
View.post(Runnable) 
View.postDelayed(Runnable, long) 

您可能會因Android multithreading guide非常有用的。