#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-функционал.
Комментариев нет:
Отправить комментарий