Стоит задача, чтобы отправить на сервер запрос и получить с него ответ в виду json. Пытался найти информацию в интернете, но попадались лишь готовые решения, без какого-либо объяснения.
Можете подсказать с объяснением, как правильно сделать подобный запрос на сервер? Желательно, с дальнейшим чтением json.
Рекомендую научиться использовать связку Retrofit2 + RxJava2. Для начала потребуются следующие зависимости
implementation 'com.squareup.retrofit2:converter-gson:?.?.?'
implementation 'io.reactivex.rxjava2:rxjava:?.?.?'
implementation 'io.reactivex.rxjava2:rxandroid:?.?.?'
implementation 'com.squareup.retrofit2:adapter-rxjava2:?.?.?'
Создаем модель. Собственно это данные которые нам и нужны В данной связке Ответ будет автоматически разобран согласно модели.
public class User {
@SerializedName("login") \\Имя соответствует такому в json
String login;
@SerializedName("id")
Integer id;
@SerializedName("node_id")
String nodeId;
@SerializedName("avatar_url")
String avatarUrl;
@SerializedName("gravatar_id")
String gravatarId;
@SerializedName("url")
String url;
@SerializedName("html_url")
String htmlUrl;
1) Создаем API
public interface GithubApi {
@GET("users")
Single<List<User>> getUsers(@Query("since") Integer since);
// Если не использовать RxJava2CallAdapterFactory
// @GET("users")
// Call<List<User>> getMyUsers();
2) Создаем сервис
public class MyService {
// Создаем переменную API и BASE_URL
private static final String BASE_URL = "https://api.github.com/";
private GithubApi githubApi;
// Создаем конструктор
public MyService() {
Retrofit retrofit =
new Retrofit.Builder()
.baseUrl(BASE_URL)
// body (String) будет кастоваться к объектам через Gson
.addConverterFactory(GsonConverterFactory.create())
// Вместо Call будет использоваться RxJava объекты Observable или Single
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
// Инициализируем переменную через ретрофит.
githubApi = retrofit.create(GithubApi.class);
}
public Single<List<User>> userRequest(Integer since) {
return githubApi.getUsers(since);
}
// Если не использовать RxJava2CallAdapterFactory
// public Call<List<User>> getMyUsers() {
// return githubApi.getMyUsers();
// }
}
3) Создаем презентер
public class MainPresenter {
MyService myService;
Listener listener;
CompositeDisposable disposable = new CompositeDisposable();
MainPresenter(Listener listener) {
this.myService = new MyService();
this.listener = listener;
}
public void userRequest(Integer since) {
disposable.add(
myService
.userRequest(since)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
users -> {
listener.usersReceived(users);
},
throwable -> {
throwable.printStackTrace();
}));
// Если не использовать RxJava2CallAdapterFactory
// myService.getMyUsers().enqueue(new Callback<List<User>>() {
// @Override
// public void onResponse(Call<List<User>> call, Response<List<User>>
// response) {
//
// }
//
// @Override
// public void onFailure(Call<List<User>> call, Throwable t) {
//
// }
// });
}
public void clearDisposables() {
if (!disposable.isDisposed()) {
disposable.dispose();
}
}
public interface Listener {
void usersReceived(List<User> users);
}
}
4) В активити или фрагменте вызываем так
mainPresenter =
new MainPresenter(
new MainPresenter.Listener() {
@Override
public void usersReceived(List<User> users) {
// Здесь реагируем на получение данных и что угодно с ними делаем.
Toast.makeText(getApplicationContext(), new Gson().toJson(users),
Toast.LENGTH_LONG)
.show();
}
});
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
У меня на форме создания пользователяПри отправка срабатывает вызов обновления списка пользователя но запрос выполняется быстрее чем запись...
Есть условие которое проверяет название заголовка, и если оно выполняется - выводит на экран:
Задана некая дата в формате timestamp, например 1581624000, нужно понять сколько дней осталось до этой даты
Здраствуйте нужна помощь, есть задача обрезать начало текста где есть № но при этом еще проверять длину строки, есть: