簡體   English   中英

在 android studio 中使用 AsyncTask 從套接字讀取數據

[英]Reading data from socket using AsyncTask in android studio

嗨,我目前正在 android studio 中為一個學校項目開發一個消息傳遞應用程序。

我正在使用套接字讓客戶端與服務器通信,我知道你不應該在 UI 線程中調用網絡方法所以要解決這個問題我正在使用 asynctask 我已經創建了 asynctask 類來創建套接字然后發送數據它但是我在恢復數據時遇到了麻煩,因為我正在努力尋找一種方法將數據從 asynctask 中取出並返回到 UI 線程。

我嘗試使用 onpostexecute 在我用於套接字相關方法(和 asynctask 類)的類中設置一個全局變量,然后使用 getter 方法在 UI 線程中讀取它,但 UI 線程要快速讀取它在它可以被設置之前,我不想設置一個計時器來讓 UI 線程等待這個變量被設置,因為這首先違背了使用 asynctask 的意義。

我希望這里有人能指出我正確的方向,如何做到這一點,使用 asynctask 只是錯誤的方式嗎? 如果是這樣,我應該如何在 android 中實現套接字。

感謝閱讀我感謝你的時間:)

旁注:我正在使用數據輸入流和.readUTF 通過套接字接收數據。

AsyncTask 類有兩種對您的問題很重要的方法, doInBackground(Params...)onPostExecute(Result)

您正在使用 DataInputStream 通過其 readUTF 方法從您的套接字中檢索數據。 readUTF 方法返回一個字符串。 我不確定您傳遞給套接字的數據是什么以啟動請求/響應操作,但無論該數據類型是什么,您都需要用它覆蓋 doInBackground 方法。 例如,假設您正在使用套接字將一串數據傳遞給服務器。 您的 doInBackground 方法看起來像

@Override
protected String doInBackground(String... data) {
    /* set up the socket/DataInputStream, etc. and whatever else you need
       in the background */ 
    DataInputStream in = ...;
    return in.readUTF();
}

返回類型是 String 只是因為它是 readUTF 方法返回的數據,因此我假設您希望將 String 返回到 UI 線程。

接下來需要重寫onPostExecute方法如下

@Override
protected void onPostExecute(String result) {
    // do whatever needs to be done on the UI thread with the result
}

您的子類 AsyncTasks 將定義為

class SocketTask extends AsyncTask<String, Void, String> {
...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM