解决DialogFragment内存泄漏问题

参考了DialogFragment内存泄露最强解决方案,但不能解决回到后台然后重新进入后,所有的Dialog会重新显示的问题,在此基础上进一步修改。目前已基本解决,欢迎讨论。

不多说,上代码

/**
 * Created by yi.tang on 2019/11/25.
 */
public class BaseDialogFragment extends DialogFragment {

    private static final int DISMISS = 0x43;
    private static final int CANCEL = 0x44;
    private static final int SHOW = 0x45;

    private Handler mHandler;

    public BaseDialogFragment() {
        mHandler = new ListenersHandler(this);
    }


    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        //先让super.onActivityCreated不执行
        if (getShowsDialog()) {
            setShowsDialog(false);
        }
        super.onActivityCreated(savedInstanceState);
        setShowsDialog(true);

        //执行自己的onActivityCreated
        View view = getView();
        if (view != null) {
            if (view.getParent() != null) {
                throw new IllegalStateException(
                        "DialogFragment can not be attached to a container view");
            }
            getDialog().setContentView(view);
        }
        final Activity activity = getActivity();
        if (activity != null) {
            getDialog().setOwnerActivity(activity);
        }

        //this.mDialog.setCancelable(this.mCancelable);
        //使用自定义message处理dialog回调信息
        getDialog().setCancelMessage(mHandler.obtainMessage(CANCEL));
        getDialog().setDismissMessage(mHandler.obtainMessage(DISMISS));

        if (savedInstanceState != null) {
            Bundle dialogState = savedInstanceState.getBundle("android:savedDialogState");
            if (dialogState != null) {
                getDialog().onRestoreInstanceState(dialogState);
            }
        }
    }

    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        if (mHandler != null) {
            mHandler.removeCallbacksAndMessages(null);
            mHandler = null;
        }
    }
    

    public void setOnCancelListener(@Nullable DialogInterface.OnCancelListener listener) {
        if (listener != null) {
            getDialog().setCancelMessage(mHandler.obtainMessage(CANCEL, listener));
        } else {
            getDialog().setCancelMessage(mHandler.obtainMessage(CANCEL));
        }
    }

    public void setOnDismissListener(@Nullable DialogInterface.OnDismissListener listener) {
        if (listener != null) {
            getDialog().setDismissMessage(mHandler.obtainMessage(DISMISS, listener));
        } else {
            getDialog().setDismissMessage(mHandler.obtainMessage(DISMISS));
        }
    }

    private static final class ListenersHandler extends Handler {
        private final WeakReference<DialogFragment> mDialog;

        public ListenersHandler(DialogFragment fragmentDialog) {
            mDialog = new WeakReference<>(fragmentDialog);
        }

        @Override
        public void handleMessage(Message msg) {
            if (msg.what == DISMISS) {

                DialogFragment fragmentDialog = mDialog.get();
                if (fragmentDialog != null) {
                    //回调处理
                    if (msg.obj != null && msg.obj instanceof DialogInterface.OnDismissListener) {
                        ((DialogInterface.OnDismissListener) msg.obj).onDismiss(fragmentDialog.getDialog());
                    }
                    //自身处理
                    fragmentDialog.onDismiss(fragmentDialog.getDialog());
                }
                msg.setTarget(null);

            } else if (msg.what == CANCEL) {

                DialogFragment fragmentDialog = mDialog.get();
                if (fragmentDialog != null) {
                    //回调处理
                    if (msg.obj != null && msg.obj instanceof DialogInterface.OnCancelListener) {
                        ((DialogInterface.OnCancelListener) msg.obj).onCancel(mDialog.get().getDialog());
                    }
                    //自身处理
                    fragmentDialog.onCancel(fragmentDialog.getDialog());
                }
                msg.setTarget(null);
            }
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容