Я разработал все свое приложение с помощью Volley с различными классами (POJO, Parser, JSON-запрос) для разных разделов навигационного ящика (всего 7), однако после того, как все было запущено, я понял, что ему нужно использовать синхронные/блокирующие запросы какой залп обычно не делает. Все запросы Volley являются асинхронными, что означает, что иногда я нажимаю кнопку или элемент ящика, и он не показывает никаких результатов, потому что асинхронный запрос не завершился.Синхронное подключение Android к REST/JSON - Volley, VolleyPlus или дооснащение?
Я сделал некоторые исследования и нашел несколько вариантов:
- собственный RequestFuture залпа (в) метод
- VolleyPlus https://github.com/DWorkS/VolleyPlus
- Дооснащение http://square.github.io/retrofit/
Я с трудом найти учебники или примеры первых двух вариантов отправки запросов GET/POST с параметрами (X-Auth-Token, Content-Type, Accept application/json и т. д.) и переход на «Дооснащение» означает, что мне придется выбросить весь код, который я уже написал, и перезапустить с нуля.
Какова ваша рекомендация? Любые примеры Volley/VolleyPlus или учебники для этого варианта использования? Будет ли переход на «Модернизацию» стоить повторной работы?
UPDATE:
Я начал играть с Модернизированным и заменить некоторые из моих звонков волейбола. Идеально! Он делает именно то, что я хотел с еще меньшим количеством кода, чем волейбол. Пока я не занимаюсь автоматическим разбором, просто получаю необработанный HTTP-ответ в формате JSON и отправляю на предыдущие классы парсеров, которые у меня были, но в конечном итоге я их заменю, когда я получу свою голову вокруг POJO и GSON. Мне пришлось отключить строгий режим для основного действия для синхронных вызовов и добавить try/catch для устранения некоторых ошибок. Вот код Переоборудование на одном из способов:
RestAdapter.Builder builder = new RestAdapter.Builder()
.setEndpoint(neutronURL)
.setLogLevel(RestAdapter.LogLevel.FULL)
.setClient(new OkClient(new OkHttpClient()));
builder.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("X-Auth-Token", authToken);
}
});
RestAdapter adapter = builder.build();
SecurityAPI api = adapter.create(SecurityAPI.class);
if (security == null){
pDialog.setMessage("Contacting Server...");
pDialog.show();
}
try {
Response result = api.getSecSync();
security = getRawJSON(result);
} catch (RetrofitError e) {
Log.d("Retrofit Error", e.toString());
if (e.toString().contains("Unauthorized")){
tokenExpiredAlert();
}
if (offline==0 && e.toString().contains("Unable to resolve host")){
offlineAlert();
}
}
И интерфейс он называет:
public interface SecurityAPI {
@Headers({
"Accept: application/json",
"Content-Type: application/json; charset=utf-8"
})
@GET("/v2.0/security-groups")
//void getSecurityContent(Callback<Response> callback);
Response getSecSync();
}
UPDATE2:
О VolleyPlus, как бы я использовать его с этот код? Я пытался, но не получил его на работу, есть несколько ошибок, о абстрактных классах:
JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, novaURL, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("Nova on Response", response.toString());
setNovaJSON(response.toString());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("Nova on Error", "Error: " + error.getMessage());
setNovaJSON(error.toString());
}
}
) {
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("X-Auth-Token", authToken);
params.put("Accept", "application/json");
params.put("Content-Type", "application/json; charset=utf-8");
return params;
}
};
queue = VolleySingleton.getInstance(this).getRequestQueue();
//VolleySingleton.getInstance(this).addToRequestQueue(getRequest);
queue.add(getRequest);
Недавно я создал клиент WebAPI Spotify Rest, используя Volley https://github.com/SiegenthalerSolutions/spotify-web-api-android, возможно, он может вам помочь! Приветствия. –
Вы никогда не должны делать синхронного или ждать запроса в потоке пользовательского интерфейса (Основной поток). –
Должно быть синхронно, нет другого пути. Когда я нажимаю раздел ящика навигации, мне нужны данные, которые будут отображаться на фрагменте. Используя асинхронный запрос волейбола, фрагмент просто показывает пустой, и мне нужно снова щелкнуть его, чтобы получить данные. – GITcommitEd