#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(); Futureresult = es.submit(new Callable() { @Override public Boolean call() throws Exception { // Ваш исполняемый код в другом потоке... } }); return result.get(); Вот только вам нужно продумать логику, как корректно реализовать многопоточное выполнение метода. В представленном коде метод sendTrackerInfo() по сути является блокирующим, поскольку метод get() дожидается завершения выполнения потока и только после этого возвращает результат. Поэтому, скорее всего, понадобится реализовать callback-функционал.
Комментариев нет:
Отправить комментарий