La aplicación se congela por un breve momento al utilizar Retrofit con RxJava.
JSON
[
{
"countryName":"..."
},
{
"countryName":"..."
},
{
"countryName":"..."
} //etc... to 195 countries
]
Interfaz
public interface RetrofitInterface {
@GET("GetCountries.php")
Single<List<CountryModel>> getCountries();
}
Código
new Retrofit.Builder().baseUrl(Constants.BASE_URL).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava3CallAdapterFactory.create()).build().create(RetrofitInterface.class).getCountries().doOnSuccess(countryModels - > {
for (CountryModel item: countryModels) {
Chip chip = new Chip(requireContext());
chip.setText(item.getCountryName());
fragmentCountriesBinding.fragmentCountriesChipGroupMain.addView(chip);
}
}).observeOn(AndroidSchedulers.mainThread()).subscribe(new SingleObserver < List < CountryModel >> () {
@Override
public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
}
@Override
public void onSuccess(@io.reactivex.rxjava3.annotations.NonNull List < CountryModel > countryModels) {
}
@Override
public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
}
});
Estoy intentando agregar 195 países a la ChipGroup
pero la aplicación se congela por un momento durante la adición de los chips. Inicialmente, el código dentro del método onSuccess
se encontraba en el método doOnSuccess
, pero la aplicación se congelaba por un momento. Por lo tanto, el código se movió al método doOnSuccess
, pero se muestra el siguiente mensaje: Solo el hilo original que creó una jerarquía de vistas puede acceder a sus vistas.
Soy nuevo en RxJava, ¿alguna solución?
davy.ai
El problema con la implementación actual es que la vista se está actualizando en un hilo secundario, lo cual no está permitido en Android. Para solucionar esto, las actualizaciones de la vista deben ser movidas al hilo principal.
Una posible solución es utilizar el operador
observeOn
de la biblioteca RxJava para cambiar al hilo principal antes de actualizar la vista. Aquí hay un ejemplo de implementación:En esta implementación, el operador
observeOn
se utiliza para cambiar al hilo principal antes de llamar al métodosubscribe
. Esto asegura que las actualizaciones de la vista se ejecuten en el hilo principal, evitando el error “Solo el hilo original que creó una jerarquía de vistas puede modificar sus vistas”.