【发布时间】:2021-01-16 22:27:33
【问题描述】:
我的项目使用 Firestore 作为数据库。我有一个片段,它在打开时会在其 onCreate 方法中从 Firestore 请求一个文档。我已将 OnCompleteListener 附加到 .get() 方法,以便在文档获取完成时更新 UI。
问题在于,有时用户在打开片段后会在触发 onCompleteListener 之前快速移动到另一个片段。或者在某些情况下,同一个 Fragment 被调用两次,当 Fragment 的第一个实例被销毁时,它的 onCompleteListener 仍然存在,并在 Fragment 的第一个实例被销毁后触发。在这两种情况下,我都会遇到异常
Fatal Exception: java.lang.IllegalStateException: Fragment ProfileFragment{4ee762 (a8f7ae01-23be-4d47-b695-68e273b992bf)} not attached to a context.
at androidx.fragment.app.Fragment.requireContext(Fragment.java:774)
at androidx.fragment.app.Fragment.getResources(Fragment.java:838)
at androidx.fragment.app.Fragment.getString(Fragment.java:860)
at com.desivideshi.productinfo.ProfileFragment$18.onComplete(ProfileFragment.java:903)
at com.google.android.gms.tasks.zzj.run(com.google.android.gms:play-services-tasks@@17.1.0:4)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at com.google.android.gms.internal.tasks.zzb.dispatchMessage(com.google.android.gms:play-services-tasks@@17.1.0:6)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6898)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
这是我在 ProfileFragment 的 onCreate 方法中的代码 sn-p
documentReference.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (mContext != null){
if (task.isSuccessful() && task.getResult() != null && task.getResult().getData() != null) {
Map<String, Object> productsDoc = task.getResult().getData();
productsList = (List<Map<String, String>>) productsDoc.get(getString(R.string.fs_f_products_list));
if(productsList == null){
productsList = new ArrayList<>();
}
mMyProfileData.setMyProductsList(productsList);
}
} else {
Toast.makeText(mContext, "Failed to load products", Toast.LENGTH_SHORT).show();
}
createTabLayout();
profileTabLayout.selectTab(profileTabLayout.getTabAt(profileTabLayout.getSelectedTabPosition()));
progressLayoutProfileTab.setVisibility(View.GONE);
}
}
});
有没有办法删除对 OnCompleteListener 的回调,我可以将它放在 Fragment 的 onDestry() 或 onDetach() 方法中以避免此异常?
【问题讨论】:
标签: java android firebase android-fragments google-cloud-firestore