我们知道,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中就不能收到申请权限结果回调了
网友评论