2012-02-16 47 views
1

我在讀取/寫入到構建應用程序的tcp服務器時遇到了一些麻煩。在最近的一個線程中,我被建議使用服務,但這是一個建議使用asyncTask的學校項目,所以我可能會爲此付出代價。從插座讀取Android的asynctask

因此類Ive得到了是我的活動課和異步,什麼有趣的事情在活動,但發送這是工作,所以生病得到與異步一個字符串。

class ServerTask extends AsyncTask<Void, Void, Void>{ 

     public static String ip = "10.0.2.2"; 
     public static int port = 2002; 
     Socket socket; 
     public DataInputStream dis; 
     public DataOutputStream dos; 
     public String message; 

     @Override 
     protected Void doInBackground(Void... params) { 

      try { 
       socket = new Socket(ip, port); 
       dis = new DataInputStream(socket.getInputStream()); 
       dos = new DataOutputStream(socket.getOutputStream()); 

      } catch (Exception e) { 
       Log.i("AsyncTank", "Cannot create Socket"); 
      } 
      while(socket.isConnected()){ 
       read();      
        } 
       } 

      } 
      return null; 
     } 

     public void write(String message) { 
      try { 
       if (socket.isConnected()){ 
        dos.writeUTF(message); 
        dos.flush(); 
       } else { 
        Log.i("AsynkTask", "Socket appears to be closed"); 
       } 
      } catch (Exception e) { 
       Log.i("AsynkTask", "Writing failed"); 
      } 
     } 

     public String read() { 
      try { 
       if (socket.isConnected()) { 
        message = dis.readLine(); 
       } else { 
        Log.i("AsyncTask", "Cannot read"); 
       } 
      } catch (Exception e) { 
       Log.i("AsyncTask", "Cannot read from stream"); 
      } 
      return message; 
     } 
    } 

事情我知道,服務器也得到消息,但直到我重新啓動這使我相信,我不是推一個新行或東西這使得它看起來像一個行後服務器它不更新其關閉。然而,這也可能是我不負責任的病人必須閱讀的服務器。

讀一部分。但是不想工作,林不知道如何調用該方法有它不斷地傾聽和響應服務器sockt?我試圖在doInBackGround返回之前創建一個線程,但是然後應用程序開始工作幾秒鐘,由於內存不足導致部隊關閉?我需要一個線程來不斷地聽嗎?

這您可能已經猜到的全部意義就是讓聊天使讀取方法最終應該更新我的活動課一個TextView。發送方法是「工作」,但不是它應該的,雖然這可能是我之前說的服務器做一些時髦的buisness。

再一個,它甚至有可能擁有或閱讀作爲一種方法像我有沒有什麼有當服務器發送數據的反應,然後調用方法?

編輯 現在我已經搬到讀一部分,或至少其中一部分變成doInBackGround所以它現在

這有變化而簡單地硬編碼服務器中的打印行讓我讀到在客戶端排隊,所以即時猜測其工作現在非常好。

它是如何看?這是完全垃圾代碼,應該採取其他方式?得到了我的功能,但從來沒有不好學習做得更好,所以說:)。

回答

0

您應該在AsyncTask的doInBackground()方法中將您的寫入和讀取操作都寫入Socket,因爲兩者都需要時間並可能會阻塞主要(UI)線程。我不知道如何調用上面的write()方法,但是您也可能想看看question that might be related

+0

我實例化ServerTask類在我的主,並簡單做serverTask.write(tbMessage.getText()。的toString());.考慮在異步任務中使用它,但我不知道如何在不使異步的情況下調用write並編寫params [0],但這意味着我必須每次都執行serverTask.execute(要寫入的文本)並通過每次都建立一個新的連接? – Gvs 2012-02-17 03:15:25

+0

還有一件事,我打開doInBackGround中的流不會使它寫在那裏,當我使用流? – Gvs 2012-02-17 03:22:20

+0

您可以將讀/寫寫入AsyncTasks並將該流作爲參數傳遞。在上面的代碼中,doInBackground()方法中的代碼將在後臺執行,以及由於您正在從doInBackground()調用它而調用read()。 write()看起來不像你所包含的代碼。 – jengelsma 2012-02-17 15:13:07