#android
#Android
Вопрос:
Я хочу получить все элементы объекта из API и поместить их в ListView, но, похоже, я не могу заставить это работать. Он всегда возвращает «Ошибка получения данных».
Вот мой API, к которому я обращаюсь.
Число в конце — это «идентификатор квартиры», который содержит связанную комнату, и в зависимости от идентификатора, он покажет список комнат.
Пример реализации:
private void initView() {
RoomRepository roomRepository = new RoomRepository();
Intent intent = getIntent();
final String apartmentId = "rooms?apartmentId=" intent.getStringExtra(MainActivity.APARTMENTID);
roomRepository.getRoom(this, apartmentId, new CallBackData<List<Room>>() {
@Override
public void onSuccess(List<Room> rooms) {
Toast.makeText(RoomListActivity.this, "Get data successful", Toast.LENGTH_SHORT).show();
if (rooms.size() == 0)
Toast.makeText(RoomListActivity.this, "No Room found!", Toast.LENGTH_SHORT).show();
else
buildLayout(rooms);
}
@Override
public void onFail(String msg) {
Toast.makeText(RoomListActivity.this, "Get data Failed ", Toast.LENGTH_SHORT).show();
}
});
}
Мой класс репозитория-
public void getRoom(Context context, String apartmentId, final CallBackData<List<Room>> callBackData){
clientAPI clientApi = new clientAPI();
Call<ResponseBody> serviceCall = clientApi.roomSerivce().getRoom(apartmentId);
serviceCall.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response != null amp;amp; response.body() != null) {
if (response.code() == 200) {
try {
String result = response.body().string();
Type type = new TypeToken<List<Room>>() {
}.getType();
List<Room> roomList = new Gson().fromJson(result, type);
if (roomList != null) {
callBackData.onSuccess(roomList);
} else {
callBackData.onFail("No data");
}
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
callBackData.onFail("No data");
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
Конфигурация API
public RoomSerivce roomSerivce(){
return this.getService(RoomSerivce.class, configAPI.BASE_URL);
}
public static final String BASE_URL = "http://apartmentpp.azurewebsites.net/";
public static final String GET_APARTMENT_ROOM = "hoangapi/";
public interface RoomSerivce {
@GET(configAPI.GET_APARTMENT_ROOM "/{apartmentId}")
Call<ResponseBody> getRoom(@Path("apartmentId") String apartmentId);
}
Комментарии:
1. вы используете http вместо https , поэтому высока вероятность того, что сервер не получит ответа из-за конфигурации сетевой безопасности в последнем обновлении для системы безопасности .. проверьте отладку logcat и посмотрите, есть ли какое-либо сообщение, связанное с сетевой безопасностью
Ответ №1:
У вас есть дополнительный ‘/’ в вашем URL, что делает его неправильным. Посмотрите на приведенные ниже строки кода:
public static final String GET_APARTMENT_ROOM = "hoangapi/";
В конце у него есть ‘/’.
@GET(configAPI.GET_APARTMENT_ROOM "/{apartmentId}")
В начале у него есть ‘/’.
Когда вы их объединяете, это создает hoangapi//room?apartmentId=
.
Двойная косая черта является реальной причиной. Удалите тот, который находится перед apartmentId, и все готово.
Ответ №2:
Изолируя ошибку, вы можете видеть, что это происходит между приложением и сервером или после того, как сервер ответил.
Итак, вам нужно отладить код и определить, где вызывается onFail(). If вызывается, когда ответ равен нулю, вам необходимо проверить соединение между приложением и сервером. Если происходит преобразование списка, вам нужно пересмотреть свой домен и сравнить с сервером json.
Ответ №3:
попробуйте это
public interface RoomSerivce {
@GET("hoangapi/rooms")
Call<ResponseBody> getRoom(@Query("apartmentId") String apartmentId);
}