java - 如何在新线程中创建Socket

标签 java android multithreading sockets

我想创建套接字连接,但我有一些问题。我必须在新线程中创建它,但我不能。

public class SocketManager {
    private static SocketManager instance;


    private BufferedReader in;
    private PrintWriter out;
    private Socket mSocket = null;

    public static SocketManager me() {
        if (instance == null) {
            instance = new SocketManager();
        }
        return instance;
    }

    public void connection() {
        new AsyncTask<Void, Void, Void>() {

            @Override
            protected Void doInBackground(Void... params) {
                try {
                    mSocket = new Socket(Constants.CHAT_SERVER_URL, 4444);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }.execute();
    }

    public boolean isConnected() {
        return mSocket.isConnected();
    }

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        status = (TextView) findViewById(R.id.status);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
        SocketManager.me().connection();
        if (SocketManager.me().isConnected()) {
            status.setText("Connected");
        } else {
            status.setText("Disconnected");
        }

我有错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.net.Socket.isConnected()' on a null object reference

因为mSocket在新线程中创建,当我调用它时它== null;如何在新线程中创建mSocket并使用它?

最佳答案

最好的方法是使用接口(interface)。

在 Socketmanager 类中创建一个接口(interface)

public class SocketManager {
    private static SocketManager instance;
    private SocketListner listner;

    public interface SocketListner {
        void onConnectionSuccess();
        void onConnectionFailed();
    }

    public void connection(SocketListner listner) {
        this.listner = listner;
        new ConnectionTask().execute();
    }

并从doInBackGround()方法返回一个 boolean 值来检查连接是否成功

    class ConnectionTask new AsyncTask<Void, Void, Boolean>() {
        @Override
        protected Void doInBackground(Void... params) {
            //...your code

        }
        @Override
        protected void onPostExecute(Boolean result) {
            if(result) {
                listner.onConnectionSuccess();
            } else {
                listner.onConnectionFailed();
            }
        }
    }

并在您的 Activity 中实现接口(interface)

 public class YourActivity imlpements SocketListner {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
     //your code
      ..
    }
    @Override
    void onConnectionSuccess() {
        //your socket is connected
        status.setText("Connected");
    }

    @Override
    void onConnectionFailed() {
        status.setText("Disconnected");
    }
}

关于java - 如何在新线程中创建Socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32835829/

相关文章:

python - 为什么我在 Python 中的线程化 MySQLdb 查询比相同的非线程化查询慢?

java - 输入去哪里了?

java - 在编辑 JTable 时读取单元格值

java - 无法解析为变量 - Parse.com

python - 为什么我的 python 代码仅在多线程时不起作用 - Tkinter

java - 使 DateFormat 线程安全。使用什么,同步或线程本地

java - 自定义 Maven 插件和库

java - 使用 BufferedInputStream 从服务器读取音频

带有 Spring Resttemplate : Error messageConverter 的 Android

android - 如何使用从套接字流式传输的数据更新 Google map 标记位置?