如何解决替换 AsyncTask 以连接套接字的问题?
How to fix the Issue with replacing AsyncTask to connect socket?
我正在尝试使用 将我的代码替换为 AsyncTask
以在 android 中的用户和服务器之间建立连接,这就是我所做的:
注意:我没有使用任何特定的模式,只是试图在一个基本结构上实现这个目标。
主要活动:
public class MainActivity extends AppCompatActivity {
private ClientConnection connection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
connection = new ClientConnection(inputServerIp.getText().toString(), inputUserName.getText().toString(), Integer.parseInt(inputPort.getText().toString()));
}
}
客户端连接:
public class ClientConnection {
private Socket serverSocket;
private ConnectionTask taskRunner;
public ClientConnection(String ipAddress, String userName, int dstPort) {
this.ipAddress = ipAddress;
this.userName = userName;
this.dstPort = dstPort;
}
public void connect() {
taskRunner.executeAsync(new ConnectionRunningTask(ipAddress, dstPort), (data) -> {
serverSocket = data;
});
}
连接任务:
public class ConnectionTask {
private final Executor executor = Executors.newSingleThreadExecutor();
private final Handler handler = new Handler(Looper.getMainLooper());
public interface Callback<R> {
void onComplete(R result);
}
public void executeAsync(Callable<R> callable, Callback<R> callback) {
executor.execute(() -> {
try {
final R result = callable.call();
handler.post(() -> {
callback.onComplete(result);
});
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
连接运行任务:
public class ConnectionRunningTask implements Callable<Socket> {
private final String ipAddress;
private final Integer dstPort;
public ConnectionRunningTask(String ipAddress, Integer dstPort) {
this.ipAddress = ipAddress;
this.dstPort = dstPort;
}
@Override
public Socket call() throws IOException {
return new Socket(ipAddress, dstPort);
}
}
所以基于上面的代码,我将尝试解释我已经尝试过的以及当前的问题是什么:
问题: 基于上面的代码,我在 connect() 中收到以下错误,它告诉我数据是 R,你不能将它设置为 serverSocket ,由于这个错误,我无法构建应用程序。
然后我尝试在 ConnectionTask
class(Callback 和 Callable 中的 R)中用 Socket
替换所有 R
,在这种情况下应用程序是能够构建和 运行.
public interface Callback<Socket> {
void onComplete(Socket result);
}
public void executeAsync(Callable<Socket> callable, Callback<Socket> callback) {
executor.execute(() -> {
try {
final Socket result = callable.call();
handler.post(() -> {
callback.onComplete(result);
});
} catch (Exception e) {
e.printStackTrace();
}
});
}
但是基于上述方法,当我点击连接按钮时我会得到一个错误,这就是我得到的结果:
2021-12-06 04:02:26.942 16417-16417/ir.atlaspio.atlasclientchat E/AndroidRuntime: FATAL EXCEPTION: main
Process: ir.atlaspio.atlasclientchat, PID: 16417
java.lang.NullPointerException: Attempt to invoke virtual method 'void ir.atlaspio.atlasclientchat.networking.ConnectionTask.executeAsync(java.util.concurrent.Callable, ir.atlaspio.atlasclientchat.networking.ConnectionTask$Callback)' on a null object reference
at ir.atlaspio.atlasclientchat.networking.ClientConnection.connect(ClientConnection.java:38)
at ir.atlaspio.atlasclientchat.MainActivity.onClick(MainActivity.java:61)
at android.view.View.performClick(View.java:4780)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
2021-12-06 04:07:27.221 16417-16417/ir.atlaspio.atlasclientchat I/Process: Sending signal. PID: 16417 SIG: 9
在服务器端,我也检查了传入连接,但那里什么也没发生...
您没有在 ClientConnection
中实例化 taskRunner
。将此行添加到构造函数:
public ClientConnection(String ipAddress, String userName, int dstPort) {
this.ipAddress = ipAddress;
this.userName = userName;
this.dstPort = dstPort;
this.taskRunner = new ConnectionTask(); // <-- this line here
}
我正在尝试使用 AsyncTask
以在 android 中的用户和服务器之间建立连接,这就是我所做的:
注意:我没有使用任何特定的模式,只是试图在一个基本结构上实现这个目标。
主要活动:
public class MainActivity extends AppCompatActivity {
private ClientConnection connection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
connection = new ClientConnection(inputServerIp.getText().toString(), inputUserName.getText().toString(), Integer.parseInt(inputPort.getText().toString()));
}
}
客户端连接:
public class ClientConnection {
private Socket serverSocket;
private ConnectionTask taskRunner;
public ClientConnection(String ipAddress, String userName, int dstPort) {
this.ipAddress = ipAddress;
this.userName = userName;
this.dstPort = dstPort;
}
public void connect() {
taskRunner.executeAsync(new ConnectionRunningTask(ipAddress, dstPort), (data) -> {
serverSocket = data;
});
}
连接任务:
public class ConnectionTask {
private final Executor executor = Executors.newSingleThreadExecutor();
private final Handler handler = new Handler(Looper.getMainLooper());
public interface Callback<R> {
void onComplete(R result);
}
public void executeAsync(Callable<R> callable, Callback<R> callback) {
executor.execute(() -> {
try {
final R result = callable.call();
handler.post(() -> {
callback.onComplete(result);
});
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
连接运行任务:
public class ConnectionRunningTask implements Callable<Socket> {
private final String ipAddress;
private final Integer dstPort;
public ConnectionRunningTask(String ipAddress, Integer dstPort) {
this.ipAddress = ipAddress;
this.dstPort = dstPort;
}
@Override
public Socket call() throws IOException {
return new Socket(ipAddress, dstPort);
}
}
所以基于上面的代码,我将尝试解释我已经尝试过的以及当前的问题是什么:
问题: 基于上面的代码,我在 connect() 中收到以下错误,它告诉我数据是 R,你不能将它设置为 serverSocket ,由于这个错误,我无法构建应用程序。
然后我尝试在 ConnectionTask
class(Callback 和 Callable 中的 R)中用 Socket
替换所有 R
,在这种情况下应用程序是能够构建和 运行.
public interface Callback<Socket> {
void onComplete(Socket result);
}
public void executeAsync(Callable<Socket> callable, Callback<Socket> callback) {
executor.execute(() -> {
try {
final Socket result = callable.call();
handler.post(() -> {
callback.onComplete(result);
});
} catch (Exception e) {
e.printStackTrace();
}
});
}
但是基于上述方法,当我点击连接按钮时我会得到一个错误,这就是我得到的结果:
2021-12-06 04:02:26.942 16417-16417/ir.atlaspio.atlasclientchat E/AndroidRuntime: FATAL EXCEPTION: main
Process: ir.atlaspio.atlasclientchat, PID: 16417
java.lang.NullPointerException: Attempt to invoke virtual method 'void ir.atlaspio.atlasclientchat.networking.ConnectionTask.executeAsync(java.util.concurrent.Callable, ir.atlaspio.atlasclientchat.networking.ConnectionTask$Callback)' on a null object reference
at ir.atlaspio.atlasclientchat.networking.ClientConnection.connect(ClientConnection.java:38)
at ir.atlaspio.atlasclientchat.MainActivity.onClick(MainActivity.java:61)
at android.view.View.performClick(View.java:4780)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
2021-12-06 04:07:27.221 16417-16417/ir.atlaspio.atlasclientchat I/Process: Sending signal. PID: 16417 SIG: 9
在服务器端,我也检查了传入连接,但那里什么也没发生...
您没有在 ClientConnection
中实例化 taskRunner
。将此行添加到构造函数:
public ClientConnection(String ipAddress, String userName, int dstPort) {
this.ipAddress = ipAddress;
this.userName = userName;
this.dstPort = dstPort;
this.taskRunner = new ConnectionTask(); // <-- this line here
}