[英]AsyncTask work not really correctly (Android)
我正在研究一些“套接字应用程序” ,我需要帮助。 我有一个连接方法的类:
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;
}
我正在尝试使用Application类中的 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方法不能完全工作(不显示结束消息 )。 但是,有趣的是,当在主(UI)线程中执行它时,一切都很好而不在Application类中使用AsyncTask ...
可能是什么问题呢? 日志中没有错误。 该应用程序继续工作......
提前致谢))
因为你正在调用AsyncTask.get()。 这导致您在任务完成之前不会异步并阻塞。 永远不应该调用该函数。 它的使用非常有限,如果你不想做一些非常不寻常的错误。 这里也没有理由有2个异步任务。
这是你的第二个问题 - 2个异步任务。 AsyncTasks都共享相同的线程,并循环执行。 这意味着任务2无法在任务1完成之前执行 - 但是您有任务1等待任务2,这将永远不会启动。 你基本上陷入僵局。
解决方案:不要使用AsyncTask.get()。 重写这个以使用单个AsyncTask,或者使用真正的线程(这通常适用于网络,就像你在应用程序的其他地方使用AsyncTasks一样,它们将被阻止等待网络请求完成)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.