AsyncTask работает не очень корректно (Android) - PullRequest
1 голос
/ 22 апреля 2019

Я работаю над "приложением-сокетами" , и мне нужна помощь. У меня есть класс с метод подключения :

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 в Application-class :

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();
}

Но метод doInBackground в executeRequest () работает не полностью ( Конечное сообщение не отображается). Но, что интересно, все нормально без использования AsyncTask в Класс приложения , когда это делается в основном потоке (UI) ...

В чем может быть проблема? В журнале нет ошибок. Приложение продолжает работать ...


Заранее спасибо))

1 Ответ

1 голос
/ 22 апреля 2019

Потому что вы вызываете AsyncTask.get (). Это заставляет вас не быть асинхронным и блокировать, пока задача не будет завершена. Эта функция никогда не должна вызываться. Для этого есть очень ограниченное использование, и если вы не пытаетесь сделать что-то очень необычное, это неправильно. Также нет причин иметь 2 асинхронных задания.

Какая ваша вторая проблема - 2 асинхронных задания. AsyncTasks все разделяют ту же самую нить и выполняются циклически. Это означает, что задача 2 не может быть выполнена до тех пор, пока задача 1 не завершится, но у вас есть задача 1, ожидающая задачу 2, которая никогда не запустится. Вы в основном зашли в тупик.

Решение: не используйте AsyncTask.get (). Перепишите это, чтобы использовать один AsyncTask или использовать реальные потоки (это обычно предпочтительнее для работы в сети, так как если вы используете AsyncTasks в другом месте приложения, все они будут заблокированы в ожидании завершения сетевого запроса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...