7

我在应用程序中关注 MMVM 架构,一切正常,直到我使用以下代码从 ViewModel 启动活动时崩溃。方法是使用数据绑定从 XML 调用并view作为参数传递的,并且getApplication()AndroidViewModel类中的方法。

getApplication().startActivity(new Intent(view.getContext(), MyActivity.class));

我相信这是因为我没有使用 NEW_TASK 标志,因为我在 Activity 类之外开始活动。

现在有以下我能想到的解决方案,但从架构的角度来看,我不确定哪一个是最好的。

1. ViewModel 带有一个方法,该方法Activity作为参数并从片段中调用该方法

public startMyActivity(Activity activity){
   activity.startActivity(new Intent(activity, MyActivity.class));
}

现在在片段中添加一个类似这样的监听器

mBinding.myButton.setOnClickListener(){
    viewModel.startMyActivity(getActivity());  
}

2. 为意图添加一个新任务标志并将其保存在 ViewModel 本身中

Intent myIntent = new Intent(view.getContext(), MyActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
getApplication().startActivity(myIntent);

3.从fragment本身启动Activity

mBinding.myButton.setOnClickListener(){
   activity.startActivity(new Intent(activity, MyActivity.class));
}

我相信所有这些方法都可以正常工作,但要记住一个问题

是否可以在 Fragment 中单独设置侦听器以使用绑定的 ViewModels 从视图 xml 调用方法?

我不确定第二种方法是否仍会使某些操作系统中的应用程序崩溃。

从架构的角度和单元测试的角度来看,哪一种是最好的方法?

4

1 回答 1

6

我会在活动/片段中进行导航,但当然大多数情况下您想从视图模型触发导航。因此,您需要使用视图模型中的命令来通知您的视图(活动/片段)在其他地方导航。您可以使用 LiveData 更具体地说是SingleLiveEvent来执行这种“命令” 。

SingleLiveEvent 与任何 LiveData 类似,但仅当您明确为其设置值时才会触发事件,例如,当您开始从视图(活动/片段)观察它时,您不会收到它的值

于 2018-03-15T11:18:26.730 回答