Android MVVM-如何在ViewModel中引用活动
MVVM架构 这是我的观点(活动): 和视图模型:Android MVVM-如何在ViewModel中引用活动,android,mvvm,viewmodel,android-lifecycle,Android,Mvvm,Viewmodel,Android Lifecycle,MVVM架构 这是我的观点(活动): 和视图模型: public class MainActivityVM extends AndroidViewModel implements ViewModel { public MainActivityVM(@NonNull Application application) { super(application); } @Override public void onCreate() { mo
public class MainActivityVM extends AndroidViewModel implements ViewModel {
public MainActivityVM(@NonNull Application application) {
super(application);
}
@Override public void onCreate() {
model = new MyService();
model.getData(); /* <-- how do i pass the activity here? */
}
@Override public void onPause() { }
@Override public void onResume() { }
@Override public void onDestroy() { }
public static class Factory extends ViewModelProvider.NewInstanceFactory {
@NonNull
private final Application mApplication;
public Factory(@NonNull Application application) {
mApplication = application;
}
@Override
public <T extends android.arch.lifecycle.ViewModel> T create(Class<T> modelClass) {
return (T) new MainActivityVM(mApplication);
}
}
}
公共类MainActivityVM扩展AndroidViewModel实现ViewModel{
公共MainActivityVM(@NonNull应用程序){
超级(应用);
}
@重写公共void onCreate(){
model=newmyservice();
model.getData();/*{
/*以上代码需要活动引用才能通过*/
Log.d(APP_标签,“收到权限回调”);
Map resultMap=result.getResultMap();
if(resultMap.containsValue(Boolean.FALSE)){
UpdatestPCountView(“”);
showPermissionAlarmDialog();
}否则{
//获取当前步数并显示它
mReporter.start(mStepCountObserver);
}
});
}catch(异常e){Log.e(APP_标记,“权限设置失败”,e);}
}
}
编辑:如果在我的模型中看到我的请求权限,API要求活动通过-我如何将活动引用传递给请求权限
我有一个来自模型的get-permission方法。此从我的服务提供商获取权限的方法需要活动,例如requestPermission(活动)
因此,在我的ModelView中,我有一个模型对象,它是来自另一个源的数据服务
然后,如何在ViewModel中引用活动,以便调用:model.requestPermission(活动)代码>在我的ViewModel中
对此的理解是:
注意:视图模型不得引用视图、生命周期或任何
类,该类可能包含对活动上下文的引用
只要您在onCreate()方法中需要权限,您就可以将带有权限请求的逻辑移动到活动中,并将请求结果传递到viewModel。如果您将使用AndroidViewModel而不是viewModel,那么您就可以获得应用程序的上下文为什么需要将活动
传递给服务提供商?如果只需执行API调用就需要上下文
,请找到一种方法,通过创建上下文
将其传递给提供程序(使用应用程序上下文)。如果您需要活动
以获得响应的可见输出,则应在ViewModel中接收您的响应,然后将其传递给您的活动(例如,使用数据绑定)。发布一个示例代码,说明你现在是如何提出和处理请求的。谢谢,我不能免费下载代码,我稍后会更新我的问题。将活动发布到服务提供商是提供商Api要求(不是我的代码)-请求权限将弹出对话框向用户请求权限,该对话框来自第三方服务提供商。@ArtjomKönig我已用我的代码更新了问题。您是否过度设计了应用程序架构。只需将您的HealthPermissionManager
内容放入活动
。试着把你的课程减少到活动
和视图模型
。
public class MainActivityVM extends AndroidViewModel implements ViewModel {
public MainActivityVM(@NonNull Application application) {
super(application);
}
@Override public void onCreate() {
model = new MyService();
model.getData(); /* <-- how do i pass the activity here? */
}
@Override public void onPause() { }
@Override public void onResume() { }
@Override public void onDestroy() { }
public static class Factory extends ViewModelProvider.NewInstanceFactory {
@NonNull
private final Application mApplication;
public Factory(@NonNull Application application) {
mApplication = application;
}
@Override
public <T extends android.arch.lifecycle.ViewModel> T create(Class<T> modelClass) {
return (T) new MainActivityVM(mApplication);
}
}
}
public class myService{
public getData(){
if(permissionacquired(){
getdata()
}else{
requestPermission();
}
}
private void requestPermission() {
PermissionKey permKey = new PermissionKey(HealthConstants.StepCount.HEALTH_DATA_TYPE, PermissionType.READ);
HealthPermissionManager pmsManager = new HealthPermissionManager(mStore);
try {
// Show user permission UI for allowing user to change options
/* BELOW CODE REQUIRE Activity reference to PASS */
pmsManager.requestPermissions(Collections.singleton(permKey), MainActivity.this).setResultListener(result -> {
/* ABOVE CODE REQUIRE Activity reference to PASS */
Log.d(APP_TAG, "Permission callback is received.");
Map<PermissionKey, Boolean> resultMap = result.getResultMap();
if (resultMap.containsValue(Boolean.FALSE)) {
updateStepCountView("");
showPermissionAlarmDialog();
} else {
// Get the current step count and display it
mReporter.start(mStepCountObserver);
}
});
} catch (Exception e) { Log.e(APP_TAG, "Permission setting fails.", e); }
}
}