我在我的项目中使用了android AAC库和Android databinding库。我有AuthActivity和AuthViewModel两个类,它们都继承了android的ViewModel类。 在某些情况下,我需要请求Activity调用ViewModel的某些方法。例如,当用户单击Google认证或Facebook认证按钮时,这些按钮是在Activity类中初始化的(因为要初始化GoogleApiClient,我需要Activity上下文,而我无法将其传递给ViewModel,ViewModel也不能存储Activity字段)。所有与Google Api和Facebook API相关的逻辑都在Activity类中实现:
//google api initialization
googleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
//facebook login button
loginButton.setReadPermissions(Arrays.asList("email", "public_profile"));
loginButton.registerCallback(callbackManager,
我还需要调用登录意图,这也需要 Activity 上下文:
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
startActivityForResult(signInIntent, GOOGLE_AUTH);
我无法在ViewModel类中请求Facebook登录和Google登录,也无法使用startActivity intent。因此,我创建了一个名为AuthActivityListener的接口类:
public interface AuthActivityListener {
void requestSignedIn();
void requestGoogleAuth();
void requestFacebookAuth();
void requestShowDialogFragment(int type);
}
在 Activity 类中实现监听器:
AuthActivityRequester authRequestListener = new AuthActivityRequester() {
@Override
public void requestSignedIn() {
Intent intent = new Intent(AuthActivity.this, ScanActivity.class);
startActivity(intent);
AuthActivity.this.finish();
}
@Override
public void requestGoogleAuth() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
startActivityForResult(signInIntent, GOOGLE_AUTH);
}
...
并将此监听器分配给视图模型类,以调用活动方法:
// in constructor
this.authRequester = listener;
// call activity method
public void onClickedAuthGoogle() {
authRequester.requestGoogleAuth();
}
在 Google 或 Facebook 认证通过后,我从活动中调用视图模型方法:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
if (requestCode == GOOGLE_AUTH) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
GoogleSignInAccount acct = result.getSignInAccount();
if (acct != null) {
viewModel.onGoogleUserLoaded(acct.getEmail(), acct.getId());
} else {
viewModel.onGoogleUserLoaded("", "");
}
}
}
}
请问这种在视图模型和活动之间进行通信的方法正确吗?还是我需要找到另一种调用视图模型中活动方法的方式?