Java 服务或后台线程
我已经在android中创建了一个蓝牙tic-tac-toe应用程序。由于我不熟悉安卓系统,我是通过在网上阅读源代码来学习的。到目前为止,它的工作原理是这样的:Java 服务或后台线程,java,android,multithreading,Java,Android,Multithreading,我已经在android中创建了一个蓝牙tic-tac-toe应用程序。由于我不熟悉安卓系统,我是通过在网上阅读源代码来学习的。到目前为止,它的工作原理是这样的: 活动1>显示新游戏、关于、退出。这里没什么 活动2>带有按钮的listview可用于发现和查找设备。用户触摸发现的设备并建立连接。另一个按钮用于交换玩家姓名,另一个按钮用于转到下一个活动 活动3>决定哪位玩家先走。3个按钮对应于岩石、纸张、剪刀,另一个按钮用于交换信息,以及一个按钮用于转到下一个活动 活动4>实际游戏。一些逻辑(它不是
- 活动1>显示新游戏、关于、退出。这里没什么
- 活动2>带有按钮的listview可用于发现和查找设备。用户触摸发现的设备并建立连接。另一个按钮用于交换玩家姓名,另一个按钮用于转到下一个活动
- 活动3>决定哪位玩家先走。3个按钮对应于岩石、纸张、剪刀,另一个按钮用于交换信息,以及一个按钮用于转到下一个活动
- 活动4>实际游戏。一些逻辑(它不是普通的tic-tac-toe),但基本上在用户触摸时,它进行计算,发送一个整数,并等待返回的数据
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()
?好吧,如果你的屏幕在逻辑上是不同的(比如splash/setting/main/about),那么让它们成为不同的活动是有意义的——这样当你的应用程序变得更复杂时,你仍然不会得到一个做得太多的怪物类
至于线程与服务——如果您正确地管理线程(断开onPause()中的套接字并终止线程,然后将其恢复到onResume()中,等等),那么您的方法就没有问题。但是,如果您希望在后台接收数据,或者出于其他原因需要更复杂的生命周期,那么服务就是您的事情。听起来您有很多事情要做!通常最好是显示代码,如果可能的话,那就太好了。但是请不要展示太多,否则人们不会看的。作为第一个猜测-听起来您可能不需要使用
Thread
对象。很多时候,人们忽视了java.util.concurrent
(这是一个遗憾,因为它可以产生更好的代码)。服务是一种在没有UI界面的情况下保持作业正常工作的方法。即使应用程序不在前台,你也需要保持蓝牙连接吗?不,我只需要在游戏运行时才需要连接。我没有发布代码的原因是,如果没有所有这些,它可能没有意义:(不过我会尝试。