Android 如何在更改活动之前检查套接字是否已建立
每当我运行代码时,当我的套接字连接建立时,我不会被重定向到下一个活动,相反,它会移动到else部分,并显示连接失败toast。我知道它连接正确,从我的其他设备的输出。我的IF状况有问题吗?或者“Socket!=null”使用不正确Android 如何在更改活动之前检查套接字是否已建立,android,sockets,Android,Sockets,每当我运行代码时,当我的套接字连接建立时,我不会被重定向到下一个活动,相反,它会移动到else部分,并显示连接失败toast。我知道它连接正确,从我的其他设备的输出。我的IF状况有问题吗?或者“Socket!=null”使用不正确 public void connecttoserver(View view){ final TextView txtenterlumens; txtenterlumens = (TextView) findViewById(R.id.txtenterl
public void connecttoserver(View view){
final TextView txtenterlumens;
txtenterlumens = (TextView) findViewById(R.id.txtenterlumens);
if(!txtenterlumens.getText().toString().equals("")) {
enterlumens = Integer.parseInt(txtenterlumens.getText().toString());
new Thread(new ClientThread()).start();
if(socket!=null){
Intent goToNextActivity = new Intent(getApplicationContext(), MainActivity.class);
startActivity(goToNextActivity);
}
else {
Toast.makeText(LoginActivity.this, "Fail to connect!", Toast.LENGTH_LONG).show();
txtenterlumens.setText("");
}
}
else{
Toast.makeText(LoginActivity.this, "Please enter correct Lumens!", Toast.LENGTH_LONG).show();
txtenterlumens.setText("");
}
}
这是我的套接字创建代码:
public class ClientThread implements Runnable {
@Override
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);
setSocket(socket);
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
您正在
ClientThread
中创建套接字,但在另一个类中验证它,但无法检索它。将此方法添加到ClientThread
:
public boolean isConnected(){
return socket !=null
}
然后稍微编辑您的连接到服务器
:
ClientThread ct = new new ClientThread();
new Thread(ct).start();
if(ct.isConnected(){...}
您在另一个线程上初始化套接字,因此无法立即获得结果。让我们做下面这样的事情。我还没有测试这段代码
public void connecttoserver(View view){
final TextView txtenterlumens;
txtenterlumens = (TextView) findViewById(R.id.txtenterlumens);
if(!txtenterlumens.getText().toString().equals("")) {
enterlumens = Integer.parseInt(txtenterlumens.getText().toString());
new Thread(new ClientThread(new EstablishListener() {
public void onEstablishCompleted(Socket socket) {
setSocket(socket);
if(socket!=null){
Intent goToNextActivity = new Intent(getApplicationContext(), MainActivity.class);
startActivity(goToNextActivity);
}
else {
Toast.makeText(LoginActivity.this, "Fail to connect!", Toast.LENGTH_LONG).show();
txtenterlumens.setText("");
}
}
})).start();
}
else{
Toast.makeText(LoginActivity.this, "Please enter correct Lumens!", Toast.LENGTH_LONG).show();
txtenterlumens.setText("");
}
}
public class ClientThread implements Runnable {
EstablishListener mListener = null;
public ClientThread(EstablishListener listner) {
mListener = listner;
}
@Override
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);
mListener.onEstablishCompleted(socket);
} catch (UnknownHostException e1) {
mListener.onEstablishCompleted(null);
e1.printStackTrace();
} catch (IOException e1) {
mListener.onEstablishCompleted(null);
e1.printStackTrace();
}
}
}
// Create function interface for callback
public interface EstablishListener {
void onEstablishCompleted(Socket socket);
}
谢谢大家的帮助。我决定,如果我在ClientThread中检查套接字连接和活动更改,这将是最简单的
public class ClientThread implements Runnable {
@Override
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);
setSocket(socket);
if(socket!=null){
Intent goToNextActivity = new Intent(getApplicationContext(), MainActivity.class);
startActivity(goToNextActivity);
}
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
您没有在
connecttoserver
中设置套接字,这就是为什么它总是为空。您可以发布包含connecttoserver()方法的整个类文件吗?@JozefDochan我已经用这行代码设置了套接字。新线程(新ClientThread()).start();哦,我现在明白了。但即使使用你的方法,我仍然会遇到同样的问题。即使新活动成功连接,我也不会被引导到该活动