【发布时间】:2020-03-31 15:58:09
【问题描述】:
我在我的应用程序中使用了一些 Firebase 任务,当它正在执行任务时,我想显示一个加载对话框,该对话框不能通过点击外部或按返回等来取消,并且将在结束时被关闭任务。例如;
FragmentManager fm = getSupportFragmentManager();
LoadingDialog ld = new LoadingDialog();
ld.show(fm, "dialog");
storageReference.getDownloadUrl().addOnSuccessListener(uri -> {
Fragment dialog = fm.findFragmentByTag("dialog");
if (dialog != null) {
LoadingDialog ld = (LoadingDialog) dialog;
ld.dismiss();
}
});
当方向状态固定但在处理过程中方向改变fm.findFragmentByTag("dialog");在任务完成后返回null时,它按预期工作。
我的 LoadingDialog 类扩展了 DialogFragment;
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Activity activity = getActivity();
assert activity != null;
AlertDialog.Builder builder =
new AlertDialog.Builder(activity, R.style.LoadingDialog);
LayoutInflater inflater = activity.getLayoutInflater();
View view = inflater.inflate(R.layout.dialog_loading, null);
builder.setView(view);
setCancelable(false);
return builder.create();
}
@Override
public void show(FragmentManager manager, String tag) {
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commitAllowingStateLoss();
}
为什么我无法使用标签找到我的对话框片段?
编辑:我找到了原因,由于活动重新创建,我无法访问我的对话框片段。我执行任务的旧 Activity 被销毁,它尝试从被销毁的 Activity 访问片段管理器。
感谢@Bö macht Blau,我实现了我的ViewModel 类,并通过使用MutableLiveData 对象将一些信息传递给我观察Firebase 任务执行的活动。 java的一些示例代码;
public class AuthViewModel extends AndroidViewModel {
public MutableLiveData<LoginInfo> loginInfoLiveData;
public AuthViewModel(@NonNull Application application) {
super(application);
loginInfoLiveData = new MutableLiveData<>();
}
public void signIn(String email, String password) {
FirebaseAuth auth = FirebaseAuth.getInstance();
auth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(task -> {
FirebaseUser firebaseUser;
firebaseUser = auth.getCurrentUser();
LoginInfo loginInfo = new LoginInfo(
task.isSuccessful(),
firebaseUser != null && firebaseUser.isEmailVerified(),
task.getException());
loginInfoLiveData.postValue(loginInfo);
});
}
}
onCreate方法的活动;
authViewModel = new ViewModelProvider(this,
ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()))
.get(AuthViewModel.class);
authViewModel.loginInfoLiveData.observe(this, loginInfo -> {
hideLoadingDialog();
if (loginInfo.isSuccessful()) {
if (loginInfo.isEmailVerified()) {
startActivity(new Intent(context, MainActivity.class));
finish();
} else {
auth.signOut();
toast(R.string.verification_error);
}
} else {
handleException(loginInfo.getException());
}
});
【问题讨论】:
标签: android firebase activity-lifecycle