Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 服务或后台线程_Java_Android_Multithreading - Fatal编程技术网

Java 服务或后台线程

Java 服务或后台线程,java,android,multithreading,Java,Android,Multithreading,我已经在android中创建了一个蓝牙tic-tac-toe应用程序。由于我不熟悉安卓系统,我是通过在网上阅读源代码来学习的。到目前为止,它的工作原理是这样的: 活动1>显示新游戏、关于、退出。这里没什么 活动2>带有按钮的listview可用于发现和查找设备。用户触摸发现的设备并建立连接。另一个按钮用于交换玩家姓名,另一个按钮用于转到下一个活动 活动3>决定哪位玩家先走。3个按钮对应于岩石、纸张、剪刀,另一个按钮用于交换信息,以及一个按钮用于转到下一个活动 活动4>实际游戏。一些逻辑(它不是

我已经在android中创建了一个蓝牙tic-tac-toe应用程序。由于我不熟悉安卓系统,我是通过在网上阅读源代码来学习的。到目前为止,它的工作原理是这样的:

  • 活动1>显示新游戏、关于、退出。这里没什么
  • 活动2>带有按钮的listview可用于发现和查找设备。用户触摸发现的设备并建立连接。另一个按钮用于交换玩家姓名,另一个按钮用于转到下一个活动
  • 活动3>决定哪位玩家先走。3个按钮对应于岩石、纸张、剪刀,另一个按钮用于交换信息,以及一个按钮用于转到下一个活动
  • 活动4>实际游戏。一些逻辑(它不是普通的tic-tac-toe),但基本上在用户触摸时,它进行计算,发送一个整数,并等待返回的数据
为了实现通信,我有3个线程:serverThread用于侦听连接,connectThread用于连接到设备,commsThread用于发送和接收数据。建立连接后,只需要commsThread。这就是我失去清晰度的地方。我在游戏类中有一个commsThread类型的对象,一旦建立连接,我在活动2中调用commsThread object.start(),并保持该线程运行,直到应用程序退出。在每个活动上,我将属于该活动的句柄传递给commsThread

现在代码对我来说确实有用,但它感觉不整洁(事实上感觉像是非常脏的代码)。除了从处理程序更新UI之外,任何其他操作都需要静态对象,因此我最终将很多东西转换为静态对象。我还知道,保持线程这样运行会导致内存泄漏。现在我正在学习服务,我只想知道这样做是否正确

同样在早期的实验中,我只是简单地进行一个活动,然后点击按钮切换布局。这是一个好方法吗

这是游戏类中我的处理程序的代码

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界面的情况下保持作业正常工作的方法。即使应用程序不在前台,你也需要保持蓝牙连接吗?不,我只需要在游戏运行时才需要连接。我没有发布代码的原因是,如果没有所有这些,它可能没有意义:(不过我会尝试。