Created
May 3, 2018 15:50
-
-
Save NikitiJ/110492083d15d18c62e32c9a622140d3 to your computer and use it in GitHub Desktop.
архитектура в стиле ООП для выполнения асинхронных запросов к серверу
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
*************** Архитектура асинхронные запросы в Андроид | |
//Имеются общие классы для запросов : | |
// обертка над любыми запросами | |
public class RequestWrapper <T> { | |
public String apiVersion = "2.0"; | |
public String accessToken; | |
public T requestData; | |
public RequestWrapper(String accessToken, T requestData){ | |
this.accessToken = accessToken; | |
this.requestData = requestData; | |
} | |
} | |
//конкретный класс-модель запроса на логин пользователя | |
public class LoginRequest { | |
String phone; | |
String password; | |
String requestId; | |
public LoginRequest(String phone, String password, String requestId){ | |
this.phone = phone; | |
this.password = password; | |
this.requestId = requestId; | |
} | |
} | |
// Классы для ответа с сервера: | |
//общий базовый класс для всех запросов с клиента | |
public class BaseApiClient { | |
public static final MediaType JSON | |
= MediaType.parse("application/json; charset=utf-8"); | |
public <TRequest, TResponse> void makeRequestAsync(String urlAddress, TRequest request) { | |
OkHttpClient clientHttp = new OkHttpClient(); | |
Gson gsonConverter = new Gson(); | |
String jsonContentBody = gsonConverter.toJson(request); | |
RequestBody requestBody = RequestBody.create(JSON, jsonContentBody); | |
Request finalRequest = new Request.Builder() | |
.url(urlAddress) | |
.post(requestBody) | |
.build(); | |
clientHttp.newCall(finalRequest).enqueue(new Callback() { | |
@Override | |
public void onFailure(Call call, IOException e) { | |
Log.e("TestApp", e.getMessage()); | |
call.cancel(); | |
} | |
@Override | |
public void onResponse(Call call, Response response) throws IOException { | |
String rawResponseBody = response.body().toString(); | |
Gson gsonConverter = new Gson(); | |
TResponse responseObject; | |
// здесь также вопрос как конвертировать дженерики? и собственно вернуть данные от сервера? | |
//т.е ответ от сервера в конкретный класс модели-ответа | |
Type typeToken = new TypeToken<ResponseWrapper<LawyerLoginResponse>>(){}.getType(); | |
responseObject = gsonConverter.fromJson(rawResponseBody, typeToken); | |
} | |
}); | |
} | |
} | |
//конкретный класс для выполнения запроса на логин - клиента | |
//т.е в каждом конкретном запросе будет вызываться базовый метод, выполняющий асинхронный запрос на сервер | |
public class LawyersProfileServiceApiClient extends BaseApiClient { | |
public <TRequest> void loginAsync(TRequest request) throws IOException { | |
makeRequestAsync("http://127.0.0.1/Services/Lawyers/ProfileService.svc/Login", request); | |
} | |
} | |
//В активити вызов асинхронного запроса к серверу предполагается использовать конкретные классы и методы, основанные на базовом классе выше | |
LawyersProfileServiceApiClient apiLogin = new LawyersProfileServiceApiClient(); | |
//оборачиваем данные с формы логина | |
LoginRequest formLoginData = new LoginRequest("+79999999999", "21813323", "vsQnjxifI3nNreFA"); | |
// далее предполагается вызов метода - запроса у конкретного объекта клиентского API - что-то вроде этого | |
// реализация выполнения асинхронного запроса? | |
// как вернуть данные с сервера? | |
// как это делать асинхронно? сам процесс запроса в базовом классе, а как отловить ошибки и прочее здесь на UI ? | |
apiLogin.loginAsync(requestWrapper); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Я смотрел код на Java, например в Camunda BPM Platform. Часто встречаются такие вызовы
String processDefinitionName = task.getProcessInstance().getProcessDefinition().getName()
. Судя по структуре БД это хранится в разных, но связанных таблицах (task, process_instance и process_defenition). Как происходит, что эти вызовы выглядят как синхронные? Можно писать асинхронный код как синхронный или они дляtask
поднимают полностью все данные из всех связанных таблиц (process_instance
иprocess_definition
), загружают в память и уже из памяти можно получить данные синхронно (без выполнения дополнительных запросов в связанные таблицы) - напрямую из памяти?В примере этого гиста я вижу что асинхронный код отличается от синхронного, так же как в JS.