Fragment注意事项

我们知道,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注意事项)