Valores de una lista no cambian mediante programación

Maryam:

Tengo una Listllamada messagespropiedad en mi Activity.In el synchronization(), me llama getDateMessage(upadated_at)function.In este valor en función de messagesque ha cambiado pero cuando va programa de synchronization messageslista está vacía.

private List<message_model> messages = new ArrayList<>();
private void synchronization() {
getDateMessage(upadated_at);
    Log.e("MSDF",messages.toString()+" list tostring");
}
  private void getDateMessage(String date) {
    MessengerActivity.APIInterface apiInterface = app_net.getRetrofitInstance().create(MessengerActivity.APIInterface.class);
    retrofit2.Call<List<message_model>> call = apiInterface.getMessageDate(Ptoken, date);
    call.enqueue(new Callback<List<message_model>>() {
        @Override
        public void onResponse(Call<List<message_model>> call, Response<List<message_model>> response) {
            if(response.isSuccessful()) {
                messages.addAll(response.body());
                Log.e("MSDF",response.body().toString()+" responsebody in call");
                Log.e("MSDF",messages.toString()+" message in call");
                Log.e("MESSAGE", "getDateMessage successful");
            }
        }
        @Override
        public void onFailure(Call<List<message_model>> call, Throwable t) {
            Log.e("MESSAGE", "getDateMessage" + t.toString());
        }
    });
}

Y esta es mi Logcat.

    09-30 14:34:53.714 10763-10763/idea.mahdi.bime E/MSDF: [] list tostring
09-30 14:34:54.104 10763-10763/idea.mahdi.bime E/MSDF: [message_model{id=33, thread_id=2, user_id=15, body='چطوری', created_at='2018-09-29 10:28:26', updated_at='2018-09-29 10:28:26', deleted_at='null'}, message_model{id=30, thread_id=2, user_id=15, body='سلام', created_at='2018-09-29 09:30:40', updated_at='2018-09-29 09:30:40', deleted_at='null'}, message_model{id=7, thread_id=2, user_id=15, body='hi', created_at='2018-09-24 09:55:46', updated_at='2018-09-24 09:55:46', deleted_at='null'}] responsebody in api
09-30 14:34:54.104 10763-10763/idea.mahdi.bime E/MSDF: [message_model{id=33, thread_id=2, user_id=15, body='چطوری', created_at='2018-09-29 10:28:26', updated_at='2018-09-29 10:28:26', deleted_at='null'}, message_model{id=30, thread_id=2, user_id=15, body='سلام', created_at='2018-09-29 09:30:40', updated_at='2018-09-29 09:30:40', deleted_at='null'}, message_model{id=7, thread_id=2, user_id=15, body='hi', created_at='2018-09-24 09:55:46', updated_at='2018-09-24 09:55:46', deleted_at='null'}] message in api
09-30 14:34:54.104 10763-10763/idea.mahdi.bime 
E/MESSAGE: getDateMessage successful
Pronto Santos:

El problema es que cuando se llama a getDataMessage () que realiza una llamada asincrónica (el método de adaptación de puesta en cola ()). El servidor será llamado para obtener los mensajes de una cadena fondo de color, mientras que la aplicación Android se mantendrá en el hilo principal.

Por lo tanto, Log.e("MSDF",messages.toString()+" list tostring");se llama antes de realizar la llamada de adaptación, por lo tanto, no hay datos actuales disponibles todavía. Usted debe asegurarse de que usted está haciendo algo con los datos después de que se haya completado cargado.

private List<message_model> messages = new ArrayList<>();
private void synchronization() {
getDateMessage(upadated_at);
    // Anything you put here will be called before the data (messages) is loaded.
    // Do not work with your messages here, they'll be null.
}
  private void getDateMessage(String date) {
    MessengerActivity.APIInterface apiInterface = app_net.getRetrofitInstance().create(MessengerActivity.APIInterface.class);
    retrofit2.Call<List<message_model>> call = apiInterface.getMessageDate(Ptoken, date);
    call.enqueue(new Callback<List<message_model>>() {
        @Override
        public void onResponse(Call<List<message_model>> call, Response<List<message_model>> response) {
            if(response.isSuccessful()) {
                messages.addAll(response.body());
                Log.e("MSDF",response.body().toString()+" responsebody in call");
                Log.e("MSDF",messages.toString()+" message in call");
                Log.e("MESSAGE", "getDateMessage successful");
                // Anything you want to do with the messages should be placed here. When you are sure the data is completed. 
                Log.e("MSDF",messages.toString()+" list tostring");
            }
        }
        @Override
        public void onFailure(Call<List<message_model>> call, Throwable t) {
            Log.e("MESSAGE", "getDateMessage" + t.toString());
        }
    });
}

Vale la pena comprobar if (response.body() != null)antes de hacer algo con él para evitar NPE.

EDITAR

Como se solicitó en los comentarios. Una buena solución (Google lo recomienda) es a buscar los datos utilizando un modelo de vista como se describe en este artículo guía dev androide .

enfoque de modelo de vista es bueno porque:

  • Los datos persisten durante los cambios de configuración (por ejemplo, si se gira el dispositivo, la lista de mensajes estará todavía en su aplicación).
  • No causa pérdidas de memoria.
  • Separas vista propiedad de los datos de la lógica del controlador de interfaz de usuario.

Puede ver las otras ventajas en el artículo.

1 - Añadir los dependecies vista del modelo en su build.gradle (Módulo: app) Archivo

dependencies {
    def lifecycle_version = "1.1.1"

    // ViewModel and LiveData
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
}

Vea aquí la versión más reciente.

2 - Crear una clase ViewModel

MessageViewModel.java

public class MessagesViewModel extends ViewModel {
    private MutableLiveData<List<message_model>> messagesList;
    public LiveData<List<message_model>> getMessages() {
        if (messagesList == null) {
            messagesList = new MutableLiveData<List<message_model>>();
            loadMessages();
        }
        return messagesList;
    }

    private void loadMessages() {
        MessengerActivity.APIInterface apiInterface = app_net.getRetrofitInstance().create(MessengerActivity.APIInterface.class);
        retrofit2.Call<List<message_model>> call = apiInterface.getMessageDate(Ptoken, date);
        call.enqueue(new Callback<List<message_model>>() {
        @Override
        public void onResponse(Call<List<message_model>> call, Response<List<message_model>> response) {
            if(response.isSuccessful()) {
                if (response.body() != null) {
                    messagesList.setValue(response.body());
                }
            }
        }
        @Override
        public void onFailure(Call<List<message_model>> call, Throwable t) {
            // Handle failure
        }
        });
    }
}

3 - Obtener los mensajes en su actividad

public class MainActivity extends AppCompatActivity {
    public void onCreate(Bundle savedInstanceState) {
        // Create a ViewModel the first time the system calls an activity's onCreate() method.
        // Re-created activities receive the same MyViewModel instance created by the first activity.

        MessagesViewModel model = ViewModelProviders.of(this).get(MessagesViewModel.class);
        model.getMessages().observe(this, messagesList -> {
            // Do whatever you want with the list of messages.
        });
    }
}

Mira lo limpio que su actividad es ahora.

A continuación, se puede implementar un SwipeRefreshLayout si desea permitir a los usuarios actualizar los datos.

Si no es suficiente, se puede comprobar esta ReposViewModel

Por último, si se llama adaptación es el núcleo principal de la aplicación que va a ser lanzado al público, se debe introducir el enfoque usando MVVM Daga 2 y RxJava, como se describe en este artículo . (Esto es avanzado)

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=192511&siteId=1
Recomendado
Clasificación