【发布时间】:2019-05-15 09:46:45
【问题描述】:
我正在尝试在 android 上创建一个客户端 - 服务器应用程序。我想要一个初始化套接字并将其返回给主类的类。我在创建和连接套接字时没有任何问题(我的服务器正在正确处理连接)但是当我尝试将创建的套接字返回到主类时它为空。我错过了什么?
我尝试过使用 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();
}
}
}
【问题讨论】:
-
看起来像一个竞争条件
-
您在
SocketHandler上调用start,这将启动一个新线程,该线程将在某个时候初始化socket变量。然后在MainActivity中调用getSocket,但此时不能保证socket变量已经被初始化(这发生在一个单独的线程中)。