[英]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.