Android_安全操作Dialog

本文探讨了在Android开发中如何安全地使用Dialog,避免在Activity的onSaveInstanceState后进行show或dismiss操作导致异常。建议将Dialog的控制权交给Activity,并在onResume时处理,以确保其与Activity生命周期的协调。

开发过程中,经常涉及到Dialog,一般场景是在主线程show Dialog,异步线程后返回到主线程中dismiss,而有时候往往会在Dialog show或者 dismiss的时候抛出 Activity不活动异常或者不能在Activity onSaveInstanceState之后Action

 

原理:

Dialog的特性依赖于Activity的生命周期,所以应该把Dialog的控制权交回给Activity,让它在最合适的时候处理Dialog,而我们只需要通知Activity如何处理Dialog即可。

Activity onSaveInstanceState之后不能对Dialogshow和 dismiss操作,而是让它在onResume的时候处理了。

 

代码如下:这里以FragmentActivityDialogFragment作演示,换成ActivityDialog同样适用。


import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;

public class BaseActivity extends FragmentActivity {

	private boolean dialogOk = true;;
	
	private List<DialogAction> dialogActions;
	
	@Override
	protected void onCreate(Bundle arg0) {
		super.onCreate(arg0);
		dialogActions = new ArrayList<BaseActivity.DialogAction>();
	}
	
	@Override
	protected void onResume() {
		super.onResume();
		dialogOk = true;
		while (!dialogActions.isEmpty()) {
			DialogAction action = dialogActions.remove(0);
			action.todo();
		}
	}
	
	@Override
	public void onSaveInstanceState(Bundle outState) {
		dialogOk = false;
		super.onSaveInstanceState(outState);
	}
	
	public void dismissDialog(DialogFragment dialogFragment) {
		if (dialogOk) {
			dialogFragment.dismiss();
		} else {
			DialogDismiss dialogDismiss = new DialogDismiss(dialogFragment);
			dialogActions.add(dialogDismiss);
		}
	}
	
	public void showDialog(DialogFragment dialogFragment, String tag) {
		if (dialogOk) {
			dialogFragment.show(getSupportFragmentManager(), tag);
		} else {
			DialogShow dialogShow = new DialogShow(dialogFragment, getSupportFragmentManager(), tag);
			dialogActions.add(dialogShow);
		}
	}
	
	private static interface DialogAction {
		
		public void todo();
		
	}
	
	private static class DialogDismiss implements DialogAction {

		private DialogFragment dialogFragment;
		
		private DialogDismiss(DialogFragment dialogFragment) {
			this.dialogFragment = dialogFragment;
		}
		
		@Override
		public void todo() {
			dialogFragment.dismiss();
		}
		
	}
	
	private static class DialogShow implements DialogAction {
		
		private DialogFragment dialogFragment;
		
		private FragmentManager manager;
		
		private String tag;
		
		public DialogShow(DialogFragment dialogFragment, FragmentManager manager, String tag) {
			this.dialogFragment = dialogFragment;
			this.manager = manager;
			this.tag = tag;
		}
		
		@Override
		public void todo() {
			dialogFragment.show(manager, tag);
		}
		
	}
	
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值