簡體   English   中英

如何在新線程中創建套接字

[英]How create Socket in new Thread

我想創建Socket連接,但是有一些問題。 我必須在新線程中創建它,但我不能。

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並使用它?

我認為方法“ isConnected()”正在嘗試在初始化之前訪問mSocket。

嘗試將其更改為:

public boolean isConnected() {
    return mSocket == null ? false : mSocket.isConnected();
}

這將避免此方法出現NullPointerException。

但是這里正確的方法是使用回調,以便子線程可以在完成后通知主線程。

public class SocketTask extends AsyncTask<Void, Void, Void> {

    public interface AsyncTaskListener<T> {
        void onTaskCompleted(T t);
    }

    private final AsyncTaskListener<String> listener;

    public SocketTask(AsyncTaskListener<String> listener) {
        this.listener = listener;
    }

    @Override
    protected Void doInBackground(Void... params) {

        try {
                    mSocket = new Socket(Constants.CHAT_SERVER_URL, 4444);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
    }

    @Override
    protected void onPostExecute() {
        listener.onTaskCompleted();
    }
}

您的SocketManager類需要實現回調:

public class SocketManager implements SocketTask.AsyncTaskListener {

}

最好的方法是使用接口。

在Socketmanager類中創建一個接口

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()方法返回一個布爾值,以檢查連接是否成功

    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();
            }
        }
    }

並在您的活動中實現界面

 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");
    }
}

添加布爾值即可知道您的asynctask是否完成。

boolean mIsSocketInstanceCreated = false;

public void connection() {
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                try {
                    mSocket = new Socket(Constants.CHAT_SERVER_URL, 4444);
                    mIsSocketInstanceCreated = true;
                } catch (IOException e) {
                    e.printStackTrace();
                   mIsSocketInstanceCreated = false;
                }
                return null;
            }
        }.execute();
}

    public boolean isConnected() {
        if (mIsSocketInstanceCreated)
          return mSocket.isConnected();
        return false;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM