我正在嘗試在 android 上創(chuàng)建一個客戶端-服務(wù)器應(yīng)用程序。我想要一個初始化套接字并將其返回給主類的類。我在創(chuàng)建和連接套接字時沒有任何問題(我的服務(wù)器正在正確處理連接)但是當(dāng)我嘗試將創(chuàng)建的套接字返回到主類時它是空的。我錯過了什么?我試過使用 AsyncTask。這是主類的代碼:public class MainActivity extends AppCompatActivity { private Socket socket; private SocketHandler sH; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sH = new SocketHandler(); sH.start(); socket = sH.getSocket(); if(socket == null){ System.out.println("null"); }else{ System.out.println("not null"); } }}這是初始化套接字的類的代碼:public class SocketHandler extends Thread { private Socket socket; public Socket getSocket(){ return socket; } @Override public void run(){ try{ socket = new Socket("192.168.0.4", 9999); }catch (IOException e){ e.printStackTrace(); } }}
1 回答

郎朗坤
TA貢獻1921條經(jīng)驗 獲得超9個贊
線程是并行運行的,這意味著不能保證你的套接字連接會立即完成,但你錯誤地假設(shè)并且你踩到了經(jīng)典的競爭條件,因為此時你調(diào)用getSocket()
連接仍在建立(但這個過程還沒有尚未完成),因此socket
變量仍然null
是在創(chuàng)建SocketHandler
.
getSocket()
您需要同步代碼,執(zhí)行回調(diào)或(出于測試目的)在調(diào)用或讀取幾次之前稍等片刻(即在循環(huán)中+一些延遲/超時,除非套接字值不是null
(但請注意,您需要期望null
如果套接字連接失敗也是有效值)。
另外,如果在單獨的線程中創(chuàng)建,為什么要在主線程中讀取套接字?你不應(yīng)該在那個線程中做所有的套接字工作嗎?
添加回答
舉報
0/150
提交
取消