Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在更改活动之前检查套接字是否已建立_Android_Sockets - Fatal编程技术网

Android 如何在更改活动之前检查套接字是否已建立

Android 如何在更改活动之前检查套接字是否已建立,android,sockets,Android,Sockets,每当我运行代码时,当我的套接字连接建立时,我不会被重定向到下一个活动,相反,它会移动到else部分,并显示连接失败toast。我知道它连接正确,从我的其他设备的输出。我的IF状况有问题吗?或者“Socket!=null”使用不正确 public void connecttoserver(View view){ final TextView txtenterlumens; txtenterlumens = (TextView) findViewById(R.id.txtenterl

每当我运行代码时,当我的套接字连接建立时,我不会被重定向到下一个活动,相反,它会移动到else部分,并显示连接失败toast。我知道它连接正确,从我的其他设备的输出。我的IF状况有问题吗?或者“Socket!=null”使用不正确

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();哦,我现在明白了。但即使使用你的方法,我仍然会遇到同样的问题。即使新活动成功连接,我也不会被引导到该活动