我正在做一些"sockets-application",我需要帮助。我有一个带有connection-method的类:
public class ClientSocketConnection {
private int port = 49150;
private String host;
public ClientSocketConnection(String host){
this.host = host;
}
public boolean connect(){
Boolean isConnected = false;
AsyncTask<Void, Void, Boolean> asyncProcess = new AsyncTask<Void, Void, Boolean>() {
@Override
protected Boolean doInBackground(Void... voids) {
try {
Socket client = new Socket();
client.connect(new InetSocketAddress(host, port), 1000);
} catch (IOException ex) {
Log.d(TAG, "Client socket exception", ex);
return false;
}
return true;
}
};
asyncProcess.execute();
try {
isConnected = asyncProcess.get();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return isConnected;
}
我正在尝试在应用程序类中使用AsyncTask建立套接字连接
private void executeRequest(){
ClientSocketConnection client = new ClientSocketConnection(txtIPAddress.getText().toString());
AsyncTask<Void, Void, Boolean> connectionTask = new AsyncTask<Void, Void, Boolean>() {
@Override
protected Boolean doInBackground(Void... voids) {
Log.d(TAG, "Begin");
boolean flag = client.connect();
Log.d(TAG, "End");//Not displayed
return flag;
}
@Override
protected void onPostExecute(Boolean isConnected) {
if(isConnected){
Toast.makeText(getApplicationContext(), "Connection established", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "Incorrect IP-Address", Toast.LENGTH_SHORT).show();
}
}
};
connectionTask.execute();
}
但是executeRequest()中的doInBackground-方法不能完全工作(不显示结束消息)。但是,有趣的是,没有在应用程序类中使用AsyncTask,在主(UI)线程中执行时,一切都很好……
可能的问题是什么?日志中没有错误。应用程序将继续工作...
提前感谢))
发布于 2019-04-22 06:26:36
因为您正在调用AsyncTask.get()。这会导致您不是异步的,并且在任务完成之前阻塞。该函数永远不应该被调用。它的用途非常有限,如果你不想做一些非常不寻常的事情,那就错了。这里也没有理由有2个异步任务。
这是你的第二个问题--2个异步任务。所有AsyncTasks都共享同一线程,并以循环方式执行。这意味着在任务1完成之前无法执行任务2--但是任务1正在等待任务2,而任务2永远不会开始。你基本上把自己锁死了。
解决方案:不要使用AsyncTask.get()。将其重写为使用单个AsyncTask,或使用真正的线程(这通常是联网的首选,因为如果您在应用程序中的其他位置使用AsyncTasks,则它们都会被阻塞,等待网络请求完成)。
https://stackoverflow.com/questions/55787237
复制相似问题