Проблема в том, что когда вы вызываете getDataMessage (), он выполняет асинхронный вызов (метод модификации enqueue ()).Сервер будет вызываться для получения сообщений в фоновом потоке, в то время как приложение для Android будет оставаться в основном потоке.
Следовательно, Log.e("MSDF",messages.toString()+" list tostring");
вызывается до того, как будет выполнен вызов дооснащения, следовательно, текущие данные еще не доступны.Вы должны убедиться, что вы что-то делаете с данными после их полной загрузки.
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());
}
});
}
Стоит проверить if (response.body() != null)
, прежде чем что-то делать с этим, чтобы избежать NPE.
РЕДАКТИРОВАТЬ
Как было задано в комментариях.Хорошим решением (Google рекомендует его) является получение данных с использованием модели представления, как описано в этой статье руководства для разработчиков Android .
Подход ViewModel хорош, потому что:
- Данные сохраняются во время изменений конфигурации (например, если вы поворачиваете свое устройство, ваш список сообщений будет все еще в вашем приложении).
- Это не вызывает утечек памяти.
- Вы отделяете владение данными от логики контроллера пользовательского интерфейса.
Другие преимущества вы можете увидеть в статье.
1 - Добавьте зависимости модели представления в свойфайл build.gradle (модуль: приложение)
dependencies {
def lifecycle_version = "1.1.1"
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
}
См. здесь последнюю версию.
2 - создание класса 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 - Получить сообщения в своей деятельности
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.
});
}
}
Посмотрите, насколько чиста ваша деятельность сейчас.
Тогда вы можетереализовать SwipeRefreshLayout , если вы хотите разрешить пользователям обновлять данные.
Если этого недостаточно, вы можете проверить это ReposViewModel
Наконец, если вызов дооснащения является основным ядром вашего приложения, которое будет выпущено для широкой публики, вы должны представить MVVM-подход с использованием Dagger 2 и RxJava, как описано в этой статье .(Это продвинутый)