@@ -53,7 +53,8 @@ public class BaseDialog extends AppCompatDialog implements LifecycleOwner,
5353 ActivityAction , ResourcesAction , HandlerAction , ClickAction , AnimAction , KeyboardAction ,
5454 DialogInterface .OnShowListener , DialogInterface .OnCancelListener , DialogInterface .OnDismissListener {
5555
56- private final LifecycleRegistry mLifecycle = new LifecycleRegistry (this );
56+ @ NonNull
57+ private LifecycleRegistry mLifecycle = new LifecycleRegistry (this );
5758
5859 @ NonNull
5960 private final List <BaseDialog .OnShowListener > mShowListeners = new ArrayList <>();
@@ -78,28 +79,28 @@ public BaseDialog(@NonNull Context context, @StyleRes int themeResId) {
7879 @ Override
7980 protected void onCreate (@ Nullable Bundle savedInstanceState ) {
8081 super .onCreate (savedInstanceState );
81- mLifecycle . handleLifecycleEvent (Lifecycle .Event .ON_CREATE );
82+ handleLifecycleEvent (Lifecycle .Event .ON_CREATE );
8283 }
8384
8485 @ Override
8586 protected void onStart () {
8687 super .onStart ();
87- mLifecycle . handleLifecycleEvent (Lifecycle .Event .ON_START );
88+ handleLifecycleEvent (Lifecycle .Event .ON_START );
8889 }
8990
9091 @ Override
9192 protected void onStop () {
9293 super .onStop ();
93- mLifecycle . handleLifecycleEvent (Lifecycle .Event .ON_PAUSE );
94- mLifecycle . handleLifecycleEvent (Lifecycle .Event .ON_STOP );
94+ handleLifecycleEvent (Lifecycle .Event .ON_PAUSE );
95+ handleLifecycleEvent (Lifecycle .Event .ON_STOP );
9596 }
9697
9798 /**
9899 * {@link DialogInterface.OnShowListener}
99100 */
100101 @ Override
101102 public void onShow (DialogInterface dialog ) {
102- mLifecycle . handleLifecycleEvent (Lifecycle .Event .ON_RESUME );
103+ handleLifecycleEvent (Lifecycle .Event .ON_RESUME );
103104 // 这里解释一下为什么要创建一个新的 ArrayList,这是因为执行监听方法可能会删除 List 集合中的元素
104105 // 例如 Builder 类中的 postDelayed 方法,就会移除监听对象,所以这里遍历可能出现 ConcurrentModificationException
105106 List <BaseDialog .OnShowListener > listeners = new ArrayList <>(mShowListeners );
@@ -124,7 +125,7 @@ public void onCancel(DialogInterface dialog) {
124125 */
125126 @ Override
126127 public void onDismiss (DialogInterface dialog ) {
127- mLifecycle . handleLifecycleEvent (Lifecycle .Event .ON_DESTROY );
128+ handleLifecycleEvent (Lifecycle .Event .ON_DESTROY );
128129 List <BaseDialog .OnDismissListener > listeners = new ArrayList <>(mDismissListeners );
129130 for (OnDismissListener listener : listeners ) {
130131 listener .onDismiss (this );
@@ -137,6 +138,34 @@ public Lifecycle getLifecycle() {
137138 return mLifecycle ;
138139 }
139140
141+ /**
142+ * 处理 Lifecycle 事件
143+ */
144+ public void handleLifecycleEvent (@ NonNull Lifecycle .Event event ) {
145+ // 以下代码主要是为了解决复用 BaseDialog 对象会出现异常的问题
146+ // https://github.com/androidx/androidx/blob/4bb422f5c09d4ed7200f1bdc03a463b39743af85/lifecycle/lifecycle-runtime/src/commonMain/kotlin/androidx/lifecycle/LifecycleRegistry.kt#L89
147+ switch (mLifecycle .getCurrentState ()) {
148+ case INITIALIZED :
149+ if (event == Lifecycle .Event .ON_DESTROY ) {
150+ // 如果当前是初始化状态,并且下一个状态事件是销毁,必须要有 Create 事件过渡,否则会出现报错
151+ // java.lang.IllegalStateException: State must be at least 'CREATED' to be moved to `DESTROYED` in component
152+ mLifecycle .handleLifecycleEvent (Lifecycle .Event .ON_CREATE );
153+ }
154+ break ;
155+ case DESTROYED :
156+ if (event != Lifecycle .Event .ON_DESTROY ) {
157+ // 如果当前是销毁状态,并且下一个状态事件不是销毁,需要重置一下 Lifecycle,否则会出现报错
158+ // java.lang.IllegalStateException: State is 'DESTROYED' and cannot be moved to `STARTED` in component
159+ mLifecycle = new LifecycleRegistry (this );
160+ }
161+ break ;
162+ default :
163+ break ;
164+ }
165+ // 处理下一个状态事件
166+ mLifecycle .handleLifecycleEvent (event );
167+ }
168+
140169 /**
141170 * 获取 Dialog 的根布局
142171 */
0 commit comments