При передаче объекта другому действию с использованием Parcelable, как я могу обновить объект и увидеть изменения в исходном действии?

#java #android #object

#java #Android #объект

Вопрос:

Я работаю над простым приложением для отправки текстовых сообщений в Android. В моем MainActivity, когда пользователь нажимает на разговор с кем-либо, я отправляю свой пользовательский объект беседы через намерение с использованием Parcelable. Это работает отлично. Проблема в том, что если я изменю какие-либо поля в этом объекте, при возвращении к MainActivity ни одно из моих изменений не отображается. Насколько я могу судить, Parcelable просто передает копию объекта, а не передает ссылку на него. Есть ли какой-либо способ сохранить эти изменения в действиях?

Я хочу постоянно обновлять последнее сообщение, которое было отправлено в чате. Существует RecyclerView.Адаптер, который обновит представление новым текстом. Этот последний текст сообщения должен отображаться при возвращении к моему основному действию.

Я не могу прикрепить изображение, потому что у меня недостаточно очков репутации. Но мой MainActivity — это просто список разговоров. Мой ChatActivity — это фактический экран чата. Вот мой код:

 public class ChatActivity extends AppCompatActivity implements Parcelable {
    //receive my custom Conversation object here, left out for brevity
    mConversation.setLastMessage("This is a new message.");
    mChatAdapter.notifyDataSetChanged();
}
  

При возвращении к моей MainActivity, несмотря на изменение поля lastMessage, никаких изменений не отображается. Как я могу это сделать? Или есть альтернативный способ непрерывного обновления объекта в разных действиях?

Любая помощь очень ценится, и спасибо за ваше время. Извините, если это был запутанный вопрос.

Комментарии:

1. Можете ли вы сказать мне, как вы возвращаете свой объект Conversation обратно в MainActivity?

2. Я этого не делаю! Я просто обновляю поле lastMessage. Я надеялся, что Parcelable передаст ссылку на объект, что повлияет на все действия.

3. Может быть, вы можете импортировать jetpack ( developer.android.com/jetpack/guide ) в вашей программе. Или поддерживать свой чат с помощью ContentProider( developer.android.com/guide/topics/providers/content-providers )

4. Где хранятся ваши сообщения? Вы используете базу данных?

5. Я сохраняю их в ArrayList внутри моего ChatActivity. Здесь хранятся фактические тексты, которые отправляют люди. Переданный объект Conversation содержит поле lastMessage, которое я хочу регулярно обновлять. Спасибо, хорошо. Попробуйте ответить, я посмотрю на ссылки, которые вы прикрепили.

Ответ №1:

Вы можете использовать ViewModel для хранения и обновления ваших данных. Это позволяет вашим действиям / фрагментам просматривать данные на предмет обновлений и координирует их жизненный цикл с жизненными циклами подключенных действий / фрагментов.

Создайте новый класс ViewModel:

 public class MessagesViewModel extends ViewModel{
    
    // Define the LiveData variable(s) you want to store/interact with
    private MutableLiveData<ArrayList<Message>> messageList = new MutableLiveData<>();
    
    public MessagesViewModel(){
        // Read your file here ...
        
        // Use the file's data to update the value(s) of your LiveData
        messageList.setValue(newMessageList);
    }
    
    // Create a method for your Activity/Fragment(s) to access the LiveData
    public LiveData<ArrayList<Message>> getMessageList(){
        return messageList;
    }
    
    // Create a method for your Activity/Fragment(s) to update the LiveData
    public void updateMessageList(ArrayList<Message> updatedMessageList){
        messageList.setValue(updatedMessageList);
    }
    
    // Called when all connected Activity/Fragment lifecycles have finished
    // (If necessary, here is where you can clean up any resources your ViewModel uses)
    @Override
    protected void onCleared(){
        // Save your data back to file here ...
        
        super.onCleared();
    }
}
  

Извлеките свою ViewModel из методов onCreate () обоих ваших действий:

 // Retrieve your ViewModel
// (You may want to make this a member variable depending on where you may need to access the ViewModel from)
MessagesViewModel messagesViewModel = new ViewModelProvider(this).get(MessagesViewModel.class);

// Call observe() to receive the data as well as any updates to it
messagesViewModel.getMessageList().observe(this, new Observer<ArrayList<Message>>(){
    @Override
    public void onChanged(ArrayList<Message> messageList){
        // Do something with your data ...
    }
});
  

Когда вам нужно обновить данные из вашего действия:

 // Create your updated data ...

// Update your ViewModel with the new data
messagesViewModel.updateMessageList(updatedMessageList);
  

Вы можете найти более подробную информацию о ViewModels наhttps://developer.android.com/topic/libraries/architecture/viewmodel