Задавать вопрос: «Разрешено ли мне ...» - не очень полезный вопрос, ИМО.В документах ясно, что то, что вы предлагаете, не рекомендуется и почему.Тем не менее, я ожидаю, что ваш код, вероятно, будет работать так, как ожидалось, и поэтому «разрешен» (т.е. не предотвращен техническими ограничениями).
Один из возможных сценариев ошибок: InstanceA, равный ExampleActivity
, запускается и запускаетсякакое-то длительное задание на ExampleViewModel
.Затем, до завершения задачи, устройство поворачивается и InstanceA уничтожается из-за изменения конфигурации.Затем между моментом, когда InstanceA уничтожен и создан новый InstanceB, долгосрочная задача завершается, и ваша модель представления вызывает onEndListener.onEnd()
.За исключением: о нет!onEndListener
равно null
, поскольку оно было очищено при уничтожении InstanceA и еще не было установлено InstanceB: NullPointerException
ViewModel
было разработано (частично) точно для обработки крайних случаев, таких как приведенный выше сценарий.Таким образом, вместо того, чтобы работать против предполагаемого использования ViewModel
, почему бы просто не использовать инструменты, которые он предлагает вместе с LiveData
, чтобы выполнить то же самое?(И с меньшим количеством кода, я мог бы добавить.)
public class ExampleActivity extends AppCompatActivity {
ExampleViewModel exampleViewModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
exampleViewModel = ViewModelProviders.of(this).get(ExampleViewModel.class);
exampleViewModel.getOnEndLive().observe(this, new Observer<Boolean>() {
@Override
public void onChanged(@Nullable Boolean onEnd) {
if (onEnd != null && onEnd) {
finish();
}
}
});
}
}
public class ExampleViewModel extends ViewModel {
private MutableLiveData<Boolean> onEndLive = new MutableLiveData<>();
public MutableLiveData<Boolean> getOnEndLive() {
return onEndLive;
}
public void somethingHappens() {
onEndLive.setValue(true);
}
}
Думайте о LiveData в этом случае не как о фактических «данных» как таковых, а как о сигнале, который вы можете передать из вашей ViewModel в свою активность,Я использую этот шаблон все время.