Я пытаюсь получить JSON из REST API в виде строки.
Я использую retrofit
с scalarConverter
для этой цели. Я могу передать URL-адрес для извлечения, и мой модифицированный экземпляр также успешно создан, но я не получаю никакого ответа от сервера.
PS: на сервере нет запроса, значит, мой запрос не выходит с моей машины.
Я новичок в Android, пожалуйста, помогите мне.
Создание экземпляра модификации:
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(base)
.addConverterFactory(ScalarsConverterFactory.create())
.build();
jsonApi jsonapi=retrofit.create(jsonApi.class);
Call<String> stringcall=jsonapi.getStringResponse(speech);
Интерфейс jsonApi:
public interface jsonApi {
@GET
Call<String> getStringResponse(@Url String url);
}
основание: это базовый URL
речь: это переменная, содержащая остальную часть URL для обработки.
когда я запускаю, приложение зависает здесь с этим сообщением, отображаемым в Вкладка «Выполнить»:
W/OpenGLRenderer: Fail to change FontRenderer cache size, it already initialized
W/art: Before Android 4.1, method int android.support.v7.widget.DropDownListView.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
С нижней строкой
Call<String> stringcall=jsonapi.getStringResponse(speech);
вы просто получаете объект Call
, который представляет собой HTTP-запрос, и именно поэтому запрос не выполняется. Вам нужно использовать этот объект и вызвать метод execute
, чтобы сделать синхронный запрос, или метод enqueue
, чтобы сделать асинхронный запрос.
Поэтому, если вы хотите сделать запрос на синхронизацию, попробуйте следующее:
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(base)
.addConverterFactory(ScalarsConverterFactory.create())
.build();
jsonApi jsonapi=retrofit.create(jsonApi.class);
Call<String> stringcall=jsonapi.getStringResponse(speech);
try {
Response<String> response = stringcall.execute();
String result = response.body();
} catch (Exception ex) {
//handle exception
}
Документация по интерфейсу Call
: здесь, для справки.
@SyedAsnalRizvi, в чем ошибка/исключение при сбое приложения при использовании метода execute
?
W/System.err: android.os.NetworkOnMainThreadException W/System.err: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273) @Madhu Bhat
@SyedAsnalRizvi выглядит так, как будто сетевой вызов выполняется через поток пользовательского интерфейса. Можете ли вы попробовать ответ в stackoverflow.com/questions/13270372/…, который предлагает использовать AsyncTask для сетевых вызовов.
Я понял, спасибо за помощь. Очень признателен. @Мадху Бхат
Я попытался сделать запрос на синхронизацию методом
execute()
, но приложение вылетело. Итак, я попробовал методenqueue
, при котором приложение не падает, но ничего не показывает. @Madhu Вот фрагмент:stringcall.enqueue(new Callback<String>() { @Override public void onResponse(Call<String> call, Response<String> response) { //do something Log.d("here","here"); } @Override public void onFailure(Call<String> call, Throwable t) {} });