Хранение данных State ViewModels - PullRequest
0 голосов
/ 23 мая 2018

Итак, по словам разработчиков Android: «Компоненты архитектуры предоставляют вспомогательный класс ViewModel для контроллера пользовательского интерфейса, который отвечает за подготовку данных для пользовательского интерфейса. Объекты ViewModel автоматически сохраняются во время изменений конфигурации, так что содержащиеся в них данные сразу же становятся доступны для следующего действия.или экземпляр фрагмента. "

В приведенном ниже коде есть асинхронный класс, который вызывается в функции deleteItem.У меня такой вопрос: обрабатывает ли ViewModel также асинхронные вызовы внутри него или вызывает утечки памяти?

Спасибо

public class BorrowedListViewModel extends AndroidViewModel {

private final LiveData<List<BorrowModel>> itemAndPersonList;

private AppDatabase appDatabase;

public BorrowedListViewModel(Application application) {
    super(application);

    appDatabase = AppDatabase.getDatabase(this.getApplication());

    itemAndPersonList = appDatabase.itemAndPersonModel().getAllBorrowedItems();
}


public LiveData<List<BorrowModel>> getItemAndPersonList() {
    return itemAndPersonList;
}

public void deleteItem(BorrowModel borrowModel) {
    new deleteAsyncTask(appDatabase).execute(borrowModel);
}

private static class deleteAsyncTask extends AsyncTask<BorrowModel, Void, Void> {

    private AppDatabase db;

    deleteAsyncTask(AppDatabase appDatabase) {
        db = appDatabase;
    }

    @Override
    protected Void doInBackground(final BorrowModel... params) {
        db.itemAndPersonModel().deleteBorrow(params[0]);
        return null;
    }

}

}

1 Ответ

0 голосов
/ 23 мая 2018

Я бы привел пример, возможно, вам нужно изменить код.Сначала вам нужно изменить данные в реальном времени и подписаться на это, по вашему мнению.Затем в контроллере вы публикуете значение, сообщающее подписчику, что что-то добавляется.Таким образом, асинхронно представление будет предупреждено.

private MutableLiveData<String> databaseLiveData = new MutableLiveData<>();

...

А в классе deleteAsyncTask вы можете добавить:

protected void onPostExecute(Void result) {
     databaseLiveData.postValue("some data deleted");
}

И в классе BorrowedListViewModel этот метод для доступа из представления добавьте этот метод:

public LiveData<String> getChanger() {
        return databaseLiveData;
    }

В представлении egActivity добавьте следующее:

 private BorrowedListViewModel mBorrowedListViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...
    BorrowedListViewModel = ViewModelProviders.of(this).get(BorrowedListViewModel.class);

    subscribe();
}

private void subscribe() {
    final Observer<String> liveDataChange = new Observer<String>() {
        @Override
        public void onChanged(@Nullable final String message) {

            Log.d("Activity", message);
        }
    };

    liveDataChange.getChanger().observe(this, liveDataChange);
}

Надеюсь, что эта справка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...