Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

Как вернуть значение из thread Java

#java #android


Есть метод, который отправляет данные на сервер. Внутри метода создается новый поток,
в котором и происходит отправка на сервер. Как теперь правильно вернуть значение переменной
STATUS_SEND из потока?

public boolean sendTrackerInfo() {
    STATUS_SEND = false;
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                DataOutputStream dataOutputStream;
                String result="";
                URL url_string = new URL(url);
                HttpURLConnection connection = (HttpURLConnection)url_string.openConnection();
                connection.setRequestProperty("Content-Type", "application/json");
                connection.setRequestMethod("POST");
                connection.setDoInput(true);
                connection.setDoOutput(true);
                connection.connect();
                dataOutputStream = new DataOutputStream(connection.getOutputStream());
                byte[] data = jsonArrayToSend.toString().getBytes("UTF-8");
                Log.d(TAG, "data: " + jsonArrayToSend.toString());
                dataOutputStream.write(data);
                dataOutputStream.flush();
                dataOutputStream.close();
                result = connection.getResponseMessage();
                jsonFromServer = convertInputStreamToString(connection.getInputStream());
                Log.d(TAG, "resultRequest: " + result);
                Log.d(TAG, "jsonFromServer: " + jsonFromServer.toString());

                if (result.equals("OK")) {
                    STATUS_SEND = true;
                }
                else {
                    STATUS_SEND = false;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
    thread.start();
    return STATUS_SEND;
}

    


Ответы

Ответ 1



Для таких задач я практически всегда использую свой класс CallBack. public class CallBack { public void onSuccess() { } public void onSuccess(T result) { } public void onFail(String message) { } public void onFailure(T result) { } } Перепишем Ваш метод, с использованием данного класса: public void sendTrackerInfo(final CallBack callBack) { Thread thread = new Thread(new Runnable() { @Override public void run() { try { DataOutputStream dataOutputStream; String result=""; URL url_string = new URL(url); HttpURLConnection connection = (HttpURLConnection)url_string.openConnection(); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestMethod("POST"); connection.setDoInput(true); connection.setDoOutput(true); connection.connect(); dataOutputStream = new DataOutputStream(connection.getOutputStream()); byte[] data = jsonArrayToSend.toString().getBytes("UTF-8"); Log.d(TAG, "data: " + jsonArrayToSend.toString()); dataOutputStream.write(data); dataOutputStream.flush(); dataOutputStream.close(); result = connection.getResponseMessage(); jsonFromServer = convertInputStreamToString(connection.getInputStream()); Log.d(TAG, "resultRequest: " + result); Log.d(TAG, "jsonFromServer: " + jsonFromServer.toString()); if (result.equals("OK")) { callBack.onSuccess(); } else { callBack.onFail("error"); } } catch (Exception e) { callBack.onFail(e.getLocalizedMessage()); } } }); thread.start(); } Вызываться Ваш метод будет таким способом: sendTrackerInfo(new CallBack() { @Override public void onSuccess() { method(true); } @Override public void onFail(String error) { method(false); } }); Поскольку CallBack у меня template class, то в него можно загонять любые типы объектов и принимать в onSuccess(YourObject yourObject) тоже

Ответ 2



Используйте интерфейс Callable: ExecutorService es = Executors.newSingleThreadExecutor(); Future result = es.submit(new Callable() { @Override public Boolean call() throws Exception { // Ваш исполняемый код в другом потоке... } }); return result.get(); Вот только вам нужно продумать логику, как корректно реализовать многопоточное выполнение метода. В представленном коде метод sendTrackerInfo() по сути является блокирующим, поскольку метод get() дожидается завершения выполнения потока и только после этого возвращает результат. Поэтому, скорее всего, понадобится реализовать callback-функционал.

Комментариев нет:

Отправить комментарий