Команда Android Runtime.getRuntime (). Exec приводит к зависанию приложения перед получением вывода. - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь создать приложение, которое может пинговать серверы и получать задержки. Для которого команда

Process process = Runtime.getRuntime().exec(pingCommand);

вызывает команду system/bin/ping -c.

Итак, когда я нажимаю кнопку «Рассчитать» (используемую мной кнопку) из пользовательского интерфейса, она замораживаетприложение, пока исполняемый не будет завершен. Как исправить замораживание, чтобы оно могло позволить мне закрыть клавиатуру во время получения ответа?

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Чтобы избежать зависаний пользовательского интерфейса, запустите поток

new Thread(new Runnable() {
        public void run() {

            try {
                // Send script into runtime process
                Process process = Runtime.getRuntime().exec(pingCommand);

                // ......

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // .....
            }
        }
    }).start();
}

Альтернатива

Вы можете использовать AsyncTask, например:

private class YourTasksClass extends AsyncTask<Void, Void, String> {


    private String cmd;

    public YourTasksClass(String command) {
        this.cmd = command;
    }

    @Override
    protected String doInBackground(Void... voids) {


        try {
            Process process = Runtime.getRuntime().exec(cmd);

            // ....

            String someResult = "some kind of result";

            return someResult;

        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        if(result != null) {
            Log.d("tag", "Result: " + result);
        }

    }
}

Позже в вашем коде вы можете позвонить по этому номеру:

new YourTasksClass(pingCommand).execute();
0 голосов
/ 23 октября 2019

вы выполняете сетевой запрос в потоке пользовательского интерфейса, поэтому он зависает из-за ожидания ответа (и поддержания соединения в активном состоянии)

используйте любой из асинхронных способов работы с сетью, лучший способ для вас будет AsyncTask (переведите вызовы сетевых методов в метод doInBackground, опубликуйте результаты в onPostExecute)

...