我在android中创建了一个蓝牙tic tac toe应用程序。由于我不熟悉android,我通过阅读网络上的源代码来学习。截至目前它的工作原理如下:
为了实现通信,我有3个线程:serverThread来监听连接,connectThread连接到设备,commsThread来发送和接收数据。建立连接后,只需要commsThread。现在这是我失去清晰度的地方。我在Game类中有一个类型为commsThread的对象,一旦建立连接,我在Activity 2中调用commsThreadObject.start()并保持此线程运行直到应用程序退出。在每个活动上,我将属于该活动的句柄传递给commsThread。
现在代码对我有用,但它感觉不太整洁(实际上感觉就像非常脏的代码)。除了从处理程序更新UI之外的任何东西都需要静态对象,所以我最终将很多东西转换为静态。另外我理解保持线程像这样运行会导致内存泄漏。现在我正在学习服务,我只想知道这是否是正确的方法?
同样在早期的实验中,我只需要一个活动,并在按钮点击时切换布局。这是一个好方法吗?
这是Game class中我的处理程序的代码。
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()
?
答案 0 :(得分:0)
好吧,如果你的屏幕在逻辑上是不同的(比如splash / setting / main / about),那么让它们成为不同的活动是有意义的 - 这样当你的应用程序变得更复杂时,你仍然没有得到一个怪物类方式太多了。
至于线程与服务 - 如果你正确地管理你的线程(在onPause()中断开套接字和杀死线程并将其带回onResume()等等),那么你的方法没有问题。但是,如果您希望在后台接收数据或由于其他原因需要更复杂的生命周期,那么服务就是您的选择。