我在 android 中创建了一个蓝牙井字游戏应用程序。由于我对android不熟悉,所以我是通过阅读网上的源代码来学习的。截至目前,它的工作原理是这样的:
- Activity 1 > 显示新游戏,关于,退出。这里没什么
- 活动 2 > 带有按钮的列表视图可以发现和查找设备。用户触摸发现的设备并建立连接。另一个按钮可用于交换玩家姓名,还有一个按钮可转到下一个活动
- 活动 3 > 决定哪个玩家先走。3个按键对应石头、剪纸、剪刀,另一个按键交换信息,一个按键进入下一个活动
- 活动 4 > 实际游戏。一些逻辑(它不是普通的井字游戏),但基本上在用户触摸时它会进行计算,发送整数并等待数据返回。
为了实现通信,我有 3 个线程:用于侦听连接的 serverThread、用于连接设备的 connectThread 和用于发送和接收数据的 commsThread。建立连接后,只需要 commsThread。现在这是我失去清晰度的地方。我在 Game 类中有一个 commsThread 类型的对象,一旦建立连接,我就会在 Activity 2 中调用 commsThreadObject.start() ,并让该线程一直运行直到应用程序退出。在每个活动上,我将属于该活动的句柄传递给 commsThread。
现在代码确实对我有用,但感觉不是很整洁(实际上感觉就像很脏的代码)。除了从处理程序更新 UI 之外的任何东西都需要静态对象,所以我最终将很多东西转换为静态对象。我也明白保持这样的线程运行可能会导致内存泄漏。现在我正在学习服务,我只想知道这是否是正确的方法?
同样在早期的实验中,我只有一个活动并在按钮单击时切换布局。这是一个好方法吗?
这是我在 Game 类中的处理程序的代码。
static Handler receiveCell = new Handler() {
@Override
public void handleMessage(Message msg) {
int numOfBytesReceived = msg.arg1;
byte[] buffer = (byte[]) msg.obj;
String strReceived = new String(buffer);
strReceived = strReceived.substring(0, numOfBytesReceived);
gameInstance.changeSymbol();
int x = Integer.parseInt(strReceived);
int cur = gameInstance.curCell;
boardGroup[cur].put(x % 3, x / 3, gameInstance.current);
gameInstance.state = boardGroup[cur].checkLines();
gameInstance.checkState(cur % 3, cur / 3);
gameInstance.changeSymbol();
gameInstance.curCell = x;
if (boardGroup[x].emptyBlock() == 0) {
numPad.enableInput();
} else {
boardGroup[x].enableInput();
}
currentTurn.setText(playerName);
}
};
如您所见,我的处理程序中有很多内容。我必须使这里引用的所有变量都是静态的。相反,无论如何我可以将它移出处理程序。也许某种方式可以知道何时收到消息?像本地strReceived.wait()
和strReceived.notify()
?