es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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:

    new Retrofit.Builder()
        .baseUrl(Constants.BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
        .build()
        .create(RetrofitInterface.class)
        .getCountries()
        .observeOn(AndroidSchedulers.mainThread()) // cambiar al hilo principal
        .subscribe(new SingleObserver<><countrymodel>>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
    
            }
    
            @Override
            public void onSuccess(@NonNull List<countrymodel> countryModels) {
                for (CountryModel item : countryModels) {
                    Chip chip = new Chip(requireContext());
                    chip.setText(item.getCountryName());
                    fragmentCountriesBinding.fragmentCountriesChipGroupMain.addView(chip);
                }
            }
    
            @Override
            public void onError(@NonNull Throwable e) {
    
            }
        });
    

    En esta implementación, el operador observeOn se utiliza para cambiar al hilo principal antes de llamar al método subscribe. 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”.

Comments are closed.