2011-05-22 80 views
0

我已經編寫了用於服務器和客戶端套接字的代碼。 我已經使用線程使用處理程序。但它經常會給出例外只有創建視圖層次結構的原始線程可以觸及其視圖 如何管理來管理它?使用套接字通過Wi-Fi連接兩臺設備

下面是客戶端的Socket用於服務器的Socket代碼

public class ServerThread implements Runnable { 

    public void run() { 
     try { 
      Looper.prepare(); 
      if (SERVERIP != null) { 
       handler.post(new Runnable() { 
        public void run() { 
         serverStatus.setText("Listening on IP: " + SERVERIP); 
        } 
       }); 
       serverSocket = new ServerSocket(SERVERPORT); 
       Toast.makeText(getApplicationContext(), serverSocket.getLocalSocketAddress().toString() 
       , Toast.LENGTH_LONG).show(); 
       serverStatus.append("\n"+serverSocket.getLocalSocketAddress().toString()); 
       while (true) { 
        // listen for incoming clients 
        Socket client = serverSocket.accept(); 

          serverStatus.setText("Connected."); 


        try { 
         BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
         String line = null; 
         while ((line = in.readLine()) != null) { 
          Log.d("ServerActivity", line); 
          handler.post(new Runnable() { 
           public void run() { 

           } 
          }); 
         } 
         break; 
        } catch (Exception e) { 
         handler.post(new Runnable() { 
          public void run() { 
           serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones."); 
          } 
         }); 
         e.printStackTrace(); 
        } 
       } 
      } else { 
       handler.post(new Runnable() { 
        public void run() { 
         serverStatus.setText("Couldn't detect internet connection."); 
        } 
       }); 
      } 
     } catch (final Exception e) { 
      handler.post(new Runnable() { 
       public void run() { 
        serverStatus.setText("Error"+e.getMessage()); 

       } 
      }); 
      e.printStackTrace(); 
     } 
    } 
} 

代碼

public class ClientThread implements Runnable { 

    public void run() { 
     try { 
      InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
      Log.d("ClientActivity", "C: Connecting..."); 
      Socket socket = new Socket(serverAddr, 8080); 
      connected = true; 

       try { 
        console.append("\nC: Sending command."); 
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket 
           .getOutputStream())), true); 
         // where you issue the commands 
         out.println("Hey Server!"); 
         console.append("C: Sent."); 
       } catch (Exception e) { 
        console.append("S: Error= "+ e.getMessage()); 
       } 

      socket.close(); 
      console.append("\nC: Closed."); 
     } catch (Exception e) { 
      Log.e("Client :", e.getMessage()); 

      //console.append("\nC: Error= "); 
      connected = false; 
     } 
    } 
} 

這裏控制檯中,我試圖把某些消息,文本視圖。 我可以看到日誌,但不是在文本視圖

回答

1

只有創建視圖層次可以觸摸自己的看法如何管理來管理這個原來的線程的消息?

使用runOnUiThread()。或者,使用Handler。或者,使用post()

+0

我已經使用了handler.i m不知道我是否已經使用它right.can你發佈一些示例代碼處理程序,其中UI therad從其他線程修改。 – 2011-05-22 11:39:44

+0

@Nilesh Tupe:https://github.com/commonsguy/cw-android/tree/master/Threads/Handler – CommonsWare 2011-05-22 11:49:06

+0

請在我的代碼中建議更正或者給我一些評論,以便我能更好地理解我必須做的事情。 – 2011-05-22 12:10:54

相關問題