服务或后台线程

时间:2013-08-08 16:21:54

标签: java android multithreading

我在android中创建了一个蓝牙tic tac toe应用程序。由于我不熟悉android,我通过阅读网络上的源代码来学习。截至目前它的工作原理如下:

  • 活动1>显示新游戏,关于,退出。这里没什么。
  • 活动2>带有按钮的listview可以发现并找到设备。用户触摸已发现的设备并建立连接。另一个按钮可用于交换玩家名称,另外一个按钮可用于下一个活动
  • 活动3>决定哪个玩家先行。对应于摇滚,纸张,剪刀的3个按钮,用于交换信息的另一个按钮,以及用于进行下一个活动的按钮
  • 活动4>实际的比赛。一些逻辑(它不是普通的tic tac toe),但基本上在用户触摸时它会进行计算,发送整数并等待数据作为回报。

为了实现通信,我有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()

1 个答案:

答案 0 :(得分:0)

好吧,如果你的屏幕在逻辑上是不同的(比如splash / setting / main / about),那么让它们成为不同的活动是有意义的 - 这样当你的应用程序变得更复杂时,你仍然没有得到一个怪物类方式太多了。

至于线程与服务 - 如果你正确地管理你的线程(在onPause()中断开套接字和杀死线程并将其带回onResume()等等),那么你的方法没有问题。但是,如果您希望在后台接收数据或由于其他原因需要更复杂的生命周期,那么服务就是您的选择。