2012-06-09 49 views
2

我正在開發一個Android應用程序。將數據傳遞給正在運行的AsyncTask

我想測試異步套接字如何在Android上做一個簡單的echo客戶端。

Java tutorial我發現下面的代碼:

import java.io.*; 
import java.net.*; 

    public class EchoClient { 
     public static void main(String[] args) throws IOException { 

      Socket echoSocket = null; 
      PrintWriter out = null; 
      BufferedReader in = null; 

      try { 
       echoSocket = new Socket("taranis", 7); 
       out = new PrintWriter(echoSocket.getOutputStream(), true); 
       in = new BufferedReader(new InputStreamReader(
              echoSocket.getInputStream())); 
      } catch (UnknownHostException e) { 
       System.err.println("Don't know about host: taranis."); 
       System.exit(1); 
      } catch (IOException e) { 
       System.err.println("Couldn't get I/O for " 
            + "the connection to: taranis."); 
       System.exit(1); 
      } 

     BufferedReader stdIn = new BufferedReader(
             new InputStreamReader(System.in)); 
     String userInput; 

     while ((userInput = stdIn.readLine()) != null) { 
      out.println(userInput); 
      System.out.println("echo: " + in.readLine()); 
     } 

     out.close(); 
     in.close(); 
     stdIn.close(); 
     echoSocket.close(); 
     } 
    } 

,而不是讀形式System.in我希望讓用戶填寫一個EditText,當一個按鈕我想給用戶引入的文本用戶水龍頭那EditText。

而且,我想使用AsyncTask。以上代碼將在AsyncTask.doBackground()方法上。

我想做以下事情:用戶介紹一個文本,然後他點擊發送按鈕,然後他等待看到響應。當我得到Echo Server的響應時,我讓用戶介紹一個新的文本,並重新開始這個過程。還有另一個按鈕可以關閉套接字並結束程序。

我的問題是:如何通知有文本可發送?換句話說,當用戶點擊發送按鈕時,我必須做些什麼才能將該文本傳遞給AsyncTask?

+0

最簡單的解決方案是創建第二個AsyncTask,並在用戶點擊第二個按鈕時開始運行它。換句話說,每次點擊按鈕都會觸發一個新的AsyncTask來運行:'new MyAsyncTask()。execute(userInput);' – yorkw

+0

@yorkw以及如何從AsynkTask發回數據並從主要活動中捕獲它? –

回答

0

AsyncTask基本上可以讓你做以下事情:

  • 開始與一些參數的任務
  • 把手背景以簡單的方式線程你(你不必擔心)
  • 允許您以系統化的方式向UI線程發佈結果。

對你來說,這聽起來像你不將數據發送到任務,而是你開始任務與指定的參數。

如果您看一下AsyncTask documentation中給出的示例,您將看到模板定義的第一個參數是啓動任務的參數集。在你的情況下,你可能會想要使用URL(或者可能只是String)參數。當用戶點擊按鈕時,你開始任務,下載東西,然後發佈結果到UI線程!

+0

也許我沒有解釋清楚。我想要做以下事情:用戶引入一個文本,然後他點擊發送按鈕,然後他等待看到響應。當我得到Echo Server的響應時,我讓用戶介紹一個新的文本,並重新開始這個過程。還有另一個按鈕可以關閉套接字並結束程序。 – VansFannel

+0

如果你有一個不斷與服務器通話的後臺線程,那麼這不是AsyncTask的意義。這是相當重量級的,相反,我會考慮使用服務與自定義信使/處理程序組合,它與服務器交談並通過消息將數據放在用戶界面上。 (這是在聊天應用程序中的典型做法,順便說一句)。 –

+1

AsyncTasks意味着_tasks_,相比之下,這不是一個原子任務,而是在後臺不斷(或至少,公平地)坐在後臺並與用戶交談通過連接一個活動,這是一個服務的例子。 –

1

看起來你正在構建一個聊天應用程序。

  • 要發送短信到服務器,您可以在「發送」按鈕,一個新的AsyncTask每次啓動用戶點擊。但請確保在完成操作後停止這些任務。

  • 要收到回覆,您可以啓動Service並定期檢查您的服務器。每當您收到要顯示的新消息時,您都可以向主要活動發送廣播。而且,在活動內部,您需要創建一個BroadcastReceiver對象,該對象將監聽Service的廣播。

所以,當您BroadcastReceiverService接收新的廣播,更新您的郵件/文本消息列表中。