android-event-handle

Android事件处理

Android的事件处理涉及到3类对象

  1. 事件源 (Event source)
  2. 事件 (Event)
  3. 事件监听器 (Event listener)

事件监听器注册到事件源
外部动作触发事件
触发事件监听器
事件处理器处理事件

内部类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class EventTest extends Activity {
protected void OnCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);

Button btn = (Button)findViewById(R.id.button);
btn.setOnclickListener()
}

class MyClickListener implements OnClickListener {
public void onClick (View view) {
System.out.println("onClick");
}
}
}

外部类
MyClickListener独立出来,这种方式并不方便
访问layout中的元素会变麻烦

匿名内部类
少写一些代码

1
2
3
4
5
6
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
System.out.println("onClick");
}
});

使用Activity作为事件监听器
Activity要实现对应的接口,事件处理函数可以直接写在Activity里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class EventTest extends Activity implements OnClickListener {
protected void OnCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);

Button btn = (Button)findViewById(R.id.button);
btn.setOnclickListener()
}

@Override
public void onClick(View view) {
System.out.println("onClick");
}
}

xml中指定事件处理函数
最方便的做法
但事件处理函数的函数签名有要求,根据绑定的事件而定,比如ButtononClick要求返回类型为void,参数为View

1
2
3
4
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click me"
android:onClick="onClick">
1
2
3
4
5
6
7
8
9
10
11
12
13
public class EventTest extends Activity{
protected void OnCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);

Button btn = (Button)findViewById(R.id.button);
btn.setOnclickListener()
}

public void onClick(View view) {
System.out.println("onClick");
}
}

Handler

Android不允许其他线程访问主线程中Activity的View,所以要更新UI时通过Handler来完成

在主线程中声明一个Handler,实现对应的事件处理函数handleMessage
新线程中通过sendMessage来和主线程通信

1
2
3
4
5
6
7
8
final Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
...
}
}

myHandler.sendMessage(msg);

原理
线程间通信

Message Handler接收和处理的对象
Looper 负责读取MessageQueue中的消息,分发给对应的Handler
MessageQueue FIFO的消息队列
Handler 把消息发送给MessageQueue,处理Looper分发的消息

每个线程只能有一个Looper,初始化Looper时会创建一个MessageQueue

prepare()函数来为当前线程创建Looper对象,之后Handler才能正常使用