Android MVVM-如何在ViewModel中引用活动

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

MVVM架构

这是我的观点(活动):

和视图模型:

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); }
    }

}