【发布时间】:2020-06-01 18:07:34
【问题描述】:
最近我一直在通过《开始 Android 游戏》一书进行 Android 开发。它包含以下代码:
public class KeyboardHandler implements OnKeyListener {
boolean[] pressedKeys = new boolean[128];
Pool<KeyEvent> keyEventPool;
List<KeyEvent> keyEventsBuffer = new ArrayList<KeyEvent>();
List<KeyEvent> keyEvents = new ArrayList<KeyEvent>();
public KeyboardHandler(View view) {
PoolObjectFactory<KeyEvent> factory = new PoolObjectFactory<KeyEvent>() {
public KeyEvent createObject() {
return new KeyEvent();
}
};
keyEventPool = new Pool<KeyEvent>(factory, 100);
view.setOnKeyListener(this);
view.setFocusableInTouchMode(true);
view.requestFocus();
}
public boolean onKey(View v, int keyCode, android.view.KeyEvent event) {
if (event.getAction() == android.view.KeyEvent.ACTION_MULTIPLE)
return false;
synchronized (this) {
KeyEvent keyEvent = keyEventPool.newObject();
keyEvent.keyCode = keyCode;
keyEvent.keyChar = (char) event.getUnicodeChar();
if (event.getAction() == android.view.KeyEvent.ACTION_DOWN) {
keyEvent.type = KeyEvent.KEY_DOWN;
if(keyCode > 0 && keyCode < 127)
pressedKeys[keyCode] = true;
}
if (event.getAction() == android.view.KeyEvent.ACTION_UP) {
keyEvent.type = KeyEvent.KEY_UP;
if(keyCode > 0 && keyCode < 127)
pressedKeys[keyCode] = false;
}
keyEventsBuffer.add(keyEvent);
}
return false;
}
我又一次有点困惑为什么synchronized 是必要的,这本书说:
“记住
事件在 UI 线程上接收并在主循环线程上读取,所以我们
必须确保我们的成员都不会被并行访问。 "
首先,我认为UI线程与主线程相同(或主循环线程,有区别吗?)说UI线程正在执行这段代码,因此也接收事件(因为这个类实现了OnClickListener)。假设主循环 while(!userquit) 循环在单独的线程上运行。主循环线程如何读取事件?另外,主循环不应该在 UI 线程上运行吗?我对事件处理的看法正确吗?当 keyEvent 发生时,执行 KeyboardHandler 的线程会执行代码 onKey()。如何在 UI 线程上接收事件,但在 Main Loop 线程上读取?事件不应该在同一个线程上接收和处理吗?
【问题讨论】:
标签: java android multithreading