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.

¿En qué método del ciclo de vida debería colocar mi llamada de red para que no se vuelva a llamar cuando la pantalla se rote?

Estoy tratando de aprender la arquitectura MVVM al mostrar una lista después de consultar una API.
No estoy seguro de cómo debería manejar el problema de rotar mi dispositivo porque una vez que lo roto, se vuelve a llamar a mi método onCreate y se realiza una segunda consulta a la API. ¿Dónde debo colocar mi llamada a la red para que no realice otra consulta cuando cambia la orientación de la pantalla?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);

    viewModel = new ViewModelProvider(this).get(PostViewModel.class);

    adapter = new PostAdapter(viewModel.getListPosts());
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(adapter);

    viewModel.getGetPostsLiveData().observe(this, listPosts -> {
        Log.d(TAG, "onCreate: Called...");
        adapter.notifyDataSetChanged();
    });

    viewModel.getPosts();
}

Mi método viewModel.getPosts() realiza la consulta y se vuelve a llamar cuando cambia la orientación de la pantalla del dispositivo.

Según esta respuesta:
https://stackoverflow.com/a/28853252/11110509

Esto es el ciclo de vida de un cambio de orientación de pantalla. Para esos 3 métodos, onCreate, onStart y onResume, se llaman una vez cuando se abre la aplicación y se llaman nuevamente cada vez que la pantalla cambia. Por lo tanto, no estoy seguro de dónde debería colocar la solicitud para realizar la llamada a la red.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para evitar realizar otra consulta cuando cambia la orientación de la pantalla, puedes mover tu llamada de red al método onCreate de tu actividad. Sin embargo, también puedes usar el ViewModel para almacenar tus datos de manera que no se pierdan cuando la orientación de la pantalla cambie. Para lograr esto, puedes seguir los siguientes pasos:

    1. Mueve la llamada de red a un método separado en tu ViewModel, por ejemplo fetchData().
    2. En tu ViewModel, crea una variable booleana, por ejemplo dataFetched, e inicialízala en false.
    3. En tu método fetchData(), si la variable dataFetched es false, realiza la llamada de red y actualiza la variable dataFetched a true.
    4. En tu método onCreate, verifica si la variable dataFetched es false. Si lo es, llama a tu método fetchData().
    5. Utiliza el ViewModel para almacenar tus datos de manera que no se pierdan cuando la orientación de la pantalla cambie.

    Aquí tienes un ejemplo de código:

    public class PostViewModel extends ViewModel {
        private MutableLiveData<><post>> postListLiveData;
        private boolean dataFetched = false;
    
        public LiveData<><post>> getPostListLiveData() {
            if(postListLiveData == null) {
                postListLiveData = new MutableLiveData<>();
                fetchData();
            }
            return postListLiveData;
        }
    
        private void fetchData() {
            if(!dataFetched) {
                // realiza la llamada de red aquí y actualiza postListLiveData
                dataFetched = true;
            }
        }
    }
    

    En tu actividad:

    public class MainActivity extends AppCompatActivity {
        private PostViewModel viewModel;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            viewModel = new ViewModelProvider(this).get(PostViewModel.class);
    
            viewModel.getPostListLiveData().observe(this, listPosts -> {
                // actualiza la interfaz de usuario con listPosts
            });
        }
    }
    

    Al utilizar el componente consciente del ciclo de vida del ViewModel, puedes evitar realizar llamadas de red innecesarias cuando cambia la orientación de la pantalla.

Comments are closed.