观察者模式——Android控件的交互事件监听

先来说一下Android控件的交互事件监听。

有过Android开发经验的人都知道Android控件的事件监听流程一般有如下几步:

1、首先在布局文件***.xml中定义某一控件,我们拿登录界面来举例吧,一般登录界面中会有两个EditText控件,一个Button控件,首先在login.xml文件中定义这几个控件的布局;

2、在对应的Activity(Activity中实现了OnClickListener接口)中实例化这三个控件,接着添加button.setOnclickListener(this);

3、在重写的onClick(View v)方法中获取该button的id,然后进行事件处理。


以前没考虑过为什么要这么做,只知道按部就班的实现,但是这几天看《Android开发精要》这本书,里面说到Android UI 设计中的UI交互事件监听遵循观察者模式,才对其设计进行了分析。试想,如果想知道具有状态变化属性的控件什么时候发生状态变化,我们总不能单独开个线程经常监听它吧?所以这时需要有个好的设计模式来解决这种情况,当控件状态发生变化时能主动将变化的状态推送给其他相关的类,那么观察者模式正好满足这种情况。

那么什么是观察者模式呢?首先我们来看一下介绍观察者模式都会贴的一张图:

观察者模式——Android控件的交互事件监听_第1张图片

这是来自wiki百科中的图片,Observer表示抽象的观察者,ConcreteObserver表示具体的观察者,实现了抽象观察者;Subject表示抽象主题,抽象主题相当于观察者要观察的一类对象,ConcreteSubject表示具体的主题,实现了抽象主题。具体到AndroidUI事件监听,我们来看一下对应关系,还是拿登录主界面的例子来举例。


先贴一段代码:

//OnClickListener是一个接口,是抽象观察者,LoginActivity实现了这个接口,就变成了一个具体的观察者,
//观察的对象就是UI对象(即主题)
public class LoginActivity extends Activity implements OnClickListener{
	private EditText et_username, et_password;
	private Button btn_forget_psd,btn_login_now, btn_goto_register;
	private CheckBox cb_remember_psd;
	//等待的对话框
	private Dialog dialog = null;
	Intent intent = null;
	private String jsonStr;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_login_main);
		initView();
	}
	
	private void initView()
	{
		et_username = (EditText)findViewById(R.id.et_username);
		et_password = (EditText)findViewById(R.id.et_password);
		btn_forget_psd = (Button)findViewById(R.id.btn_forget_psd);
		btn_login_now = (Button)findViewById(R.id.btn_login_now);
		cb_remember_psd = (CheckBox)findViewById(R.id.cb_remember_psd);
		btn_goto_register = (Button)findViewById(R.id.btn_goto_register);
				
		btn_forget_psd.setOnClickListener(this);
		//设置了登录按钮(具体的主题)设置监听这个操作(抽象主题中提供的操作)
		btn_login_now.setOnClickListener(this);
		cb_remember_psd.setOnClickListener(this);
		btn_goto_register.setOnClickListener(this);
	}

	//观察者中的操作
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.btn_forget_psd:
			intent = new Intent(LoginActivity.this,ForgetPasswordActivity.class);
			startActivity(intent);
			this.finish();
			break;
		case R.id.btn_login_now:
			loginSubmit();
			break;
		case R.id.cb_remember_psd:
			break;
		case R.id.btn_goto_register:
			intent = new Intent(LoginActivity.this, RegisterActivity.class);
			startActivity(intent);
			//this.finish();
		default:
			break;
		}
	}


 
  

通过查看OnClickLister的声明,我们可以看到这个抽象观察者的接口方法:

  /**
     * Interface definition for a callback to be invoked when a view is clicked.
     */
    public interface OnClickListener {
        /**
         * Called when a view has been clicked.
         *
         * @param v The view that was clicked.
         */
        void onClick(View v);
    }
通过查看setOnClickListener(this)的声明,我们可以看到它属于View类的一个接口,View属于一个抽象主题,由此看来button就是一个具体的主题了:

/**
     * Register a callback to be invoked when this view is clicked. If this view is not
     * clickable, it becomes clickable.
     *
     * @param l The callback that will run
     *
     * @see #setClickable(boolean)
     */
    public void setOnClickListener(OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        getListenerInfo().mOnClickListener = l;
    }
当btn_login_now的状态发生变化时,比如被用户点击了,btn_login_now通过setOnClickListener()方法通知观察者,观察者通过OnClick()方法监听到这个动作,相关的类就可以进行相应处理了。


对于观察者模式在Android交互事件监听中的分析到此结束,文中有什么说的不对的地方还请大家勘误!




你可能感兴趣的:(设计模式,Android)