2011-05-02 142 views
3

我目前正在使用Android的tcp客戶端。 我想將我的android設備連接到我電腦上的tcp服務器,並每2秒接收一次數據。問題在於,由於我在tcp客戶端中實現了while循環,因此我的應用程序正在關閉應用程序。 我試過用不同的方式寫循環,使得tcp客戶端檢查服務器套接字,但沒有成功。怎樣才能使循環,檢查服務器套接字沒有得到強制關閉?Android的TCP客戶端

這裏是我的代碼,我目前使用:

public class Connection implements Runnable { 
    @Override 
    public void run() {   
     try {      
      sk=new Socket(server,port); 
      viewsurface.setText("connected");  
      flag = true; 
     } catch (UnknownHostException e) {  
      viewsurface.setText("failed 1 socket"); 
      flag = false; 
     } catch (IOException e) {     
      viewsurface.setText("failed 2 socket"); 
      flag = false; 
     } 

     while (flag == true){    
      try { 
       checkin = sk.getInputStream(); 
       checkint = checkin.available(); 

       if (checkint > 0){ 
        try { 
         BufferedReader in = new BufferedReader(new InputStreamReader(sk.getInputStream())); 
         received = in.readLine(); 
         viewsurface.setText(received); 

        } catch (IOException e) { 
         viewsurface.setText("failed to receive"); 
        } 
       } 

      Thread.sleep(2000); 
      } catch (IOException e) { 
       viewsurface.setText("checkin failed"); 

      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

     } 
} 

}

回答

5

你需要粘貼您越來越引起力閉合異常,之前任何人都可以提供不錯的幫助。

但有些建議可能會解決問題。

  • 最有可能是問題,viewText.setText只能從UI線程調用。有很多方法可以解決這個問題。您可以使用AsyncTask,或者如果您有活動引用,則可以使用runOnUIThread並傳入調用setText的runnable。
  • Move checkin = sk.getInputStream();到循環之前。沒有理由在循環中的每個循環中獲得strem。
  • 不要在循環的每個循環中創建BufferedReader。在循環之前移動它
  • .sleep(2000)不能保證準確的2秒。

我有一些代碼格式問題,所以我很抱歉。

private class DownloadFilesTask extends AsyncTask<Void, String, Void> { 
    protected Long doInBackground(Void... nothing) { 
     try {      
      sk=new Socket(server,port); 
     publishProgress("connected");  
      flag = true; 
    } catch (UnknownHostException e) {  
     publishProgress("failed 1 socket"); 
     flag = false; 
    } catch (IOException e) {     
     publishProgress("failed 2 socket"); 
     flag = false; 
    } 

    while (flag == true){    
     try { 
      checkin = sk.getInputStream(); 
      checkint = checkin.available(); 

      if (checkint > 0){ 
       try { 
        BufferedReader in = new BufferedReader(new InputStreamReader(sk.getInputStream())); 
        received = in.readLine(); 
        publishProgress(received); 

       } catch (IOException e) { 
        publishProgress("failed to receive"); 
       } 
      } 

     Thread.sleep(2000); 
     } catch (IOException e) { 
      updateProgress(

     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    return; 
} 

protected void onProgressUpdate(String... progress) { 
    viewsurface.setText(progress[0]); 
} 

protected void onPostExecute(Void result) { 
    //nothing 
} 

} 
+0

是的,你是對的。導致力量關閉的問題的確是viewText.setText。如果我註釋掉那條線,我就不會再有任何力量了。我也在循環之前移動了checkin和bufferreader。 – cdrag 2011-05-02 11:23:16

+0

所以,現在的問題是,每當我收到一些東西並更新它/在主UI線程中顯示它時,我將如何傳遞「received」變量的值?對不起這個問題,但我是新來的android/java。 – cdrag 2011-05-02 11:51:35

+0

使用AsyncTask添加了一些示例代碼。這應該做你想做的。 – 2011-05-02 13:01:55