美文网首页
Fragment注意事项

Fragment注意事项

作者: hahaoop | 来源:发表于2022-07-24 19:02 被阅读0次

    我们知道,Fragment用起来比Activity要流畅一些,但是写起来会比Activity复杂,其中在使用Fragment的过程中我们还需注意一些地方。

    • getActivity()为空

    @Nullable
    final public FragmentActivity getActivity() {
        return mHost == null ? null : (FragmentActivity) mHost.getActivity();
        }
    
    • 使用BaseFragment的mActivity

    mActivity在onAttach初始化,在onDetach置空,所以如果fragment有异步任务用到mActivity,需要在onDestroyView的时候停掉任务,避免内存泄漏的同时还可以避免空指针异常

    • 不要在Activity执行onPause方法之后执行Fragment的commit()方法

    private void checkStateLoss() {
            if (isStateSaved()) {
                throw new IllegalStateException(
                        "Can not perform this action after onSaveInstanceState");
            }
            if (mNoTransactionsBecause != null) {
                throw new IllegalStateException(
                        "Can not perform this action inside of " + mNoTransactionsBecause);
            }
        }
    

    执行commit方法后Fragment会去检查当前状态,如果Activity执行了onSaveInstanceState方法,frament会抛异常。
    当然我们也可以使用commitAllowingStateLoss方法来避免抛出异常,但是这样可能会丢失一些操作。

    • 使用DialogFragment

    在显示弹窗前,需要判断activity的生命周期,如果在destroy,不要去show,可以重写一下show方法

    @Override
        public void show(FragmentManager manager, String tag) {
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
                if (manager.isDestroyed()) {
                    return;
                }
            }
            try {
                super.show(manager, tag);
            } catch (Exception e) {
                L.error(TAG, "show dialog failed - %s", e.getMessage());
            }
        }
    

    DialogFragment在dismiss的时候也会执行commit方法,所以在onPause之后去dismiss弹窗也会容易出现闪退,可以使用dismissAllowingStateLoss方法避免闪退

    • 在Fragment中申请权限

    可以使用fragment的申请权限的方法applyPermissions,权限回调onRequestPermissionsResult,也可以用EasyPermissions申请。但是需要注意fragment的宿主activity不要实现权限回调,不然在fragment中就不能收到申请权限结果回调了

    相关文章

      网友评论

          本文标题:Fragment注意事项

          本文链接:https://www.haomeiwen.com/subject/xmlwirtx.html