AsyncTask无法真正正常工作(Android)

时间:2019-04-21 22:13:54

标签: java android android-asynctask

我正在处理某些“套接字应用” ,我需要帮助。我有一个连接方法类:

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-class 中的 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-method 不能完全工作(不显示 End-message )。但是,有趣的是,当在主(UI)线程中使用 Application class 中的 AsyncTask 时,一切都很好...

可能是什么问题?日志中没有错误。该应用程序继续工作...


先谢谢了))

1 个答案:

答案 0 :(得分:1)

因为您正在调用AsyncTask.get()。这导致您在任务完成之前不会异步并阻塞。永远不要调用该函数。它的用途非常有限,如果您不尝试做一些非常不寻常的事情,那就错了。也没有理由在这里有2个异步任务。

这是您的第二个问题-2个异步任务。 AsyncTasks共享相同的线程,并循环执行。这意味着在任务1完成之前无法执行任务2-但是您让任务1等待任务2,它将永远不会开始。您基本上陷入僵局。

解决方案:不要使用AsyncTask.get()。重写此代码以使用单个AsyncTask或使用实际的线程(通常更适合联网,就像您在应用程序中的其他位置使用AsyncTasks一样,它们都将被阻塞,等待网络请求完成)。