2016-11-07 12 views
8

Я создаю приложение для Android с использованием MVVM и DataBinding. И у меня есть функция внутри моей ViewModel, которая запускает Activity. Можно ли иметь вызов onClick внутри ViewModel?Лучшая практика для Android MVVM startActivity

Нравится это.

public class MyViewModel { 
    public void onClick(View view, long productId) { 
     Context context = view.getContext(); 
     Intent intent = new Intent(context, ProductDetailActivity.class); 
     intent.putExtra("productId", productId); 
     context.startActivity(intent); 
    } 
} 

И в моем XML:

... 
android:onClick="@{(v) -> viewModel.onClick(v, viewModel.product.id)}"> 

Или же это будет лучшая практика, чтобы переместить его на просмотр и вызвать его из EventBus или Rx и имеют только POJO в моей ViewModel?

ответ

7

Ответ на ваш вопрос, что ваша цель?

Если вы хотите использовать MVVM для разделения проблем, чтобы вы могли тестировать вашу модель Viewmodel, вам следует попытаться сохранить все, что требует Контекст, отдельно от вашей модели Viewmodel. Viewmodel содержит основную бизнес-логику вашего приложения и не должен иметь внешних зависимостей.

Однако мне нравится, куда вы идете :) Если решение, действие которого открыто, находится в представлении, тогда очень сложно написать для него тест JUnit. Однако вы можете передать объект в viewmodel, который выполняет вызов startActivity(). Теперь в вашем модульном тесте вы можете просто высмеять этот объект и проверить, что правильная активность открыта.

+0

«Модель Viewmodel содержит основную бизнес-логику вашего приложения и не должна иметь внешних зависимостей». - Я думаю, что он всегда будет иметь внешние зависимости. Я не вижу смысла использовать ViewModel без привязки данных, и он специфичен для Android, просто проверьте импорт экземпляра: «import android.databinding.ObservableBoolean;» – LLL

4

Это абсолютно идеально, чтобы поместить его внутри ViewModel, однако вам необходимо установить ViewModel от Activity/Fragment.

Вот некоторые ссылки, на которые вы можете ознакомиться, чтобы узнать архитектуру MVVM.

Approaching Android with MVVM
Android MVVM
https://github.com/ivacf/archi
People-MVVM
MVVM on Android: What You Need to Know