关于Android线程的建议

时间:2014-11-19 02:37:02

标签: java android multithreading between

美好的一天,我在这里接受你的一些建议。基本上我有一个类有两种方法如下。它允许我将数据发送到串行端口(UART),并从中接收数据。工作良好。

现在,我必须以这样的方式修改它,它会将一些数据发送到串口 serialPort.writeBytes(src.getBytes()); 并等待回复3秒如果我在3秒之间收到回复,则必须将其更新为TextView,否则必须发送第二个数据( serialPort.writeBytes(src1.getBytes()); )并再次等待回复。

我不是线程和处理程序方面的专家,因为我刚开始学习它。请告诉我这个。非常感谢你的时间。

public void sendData(){
    final String src = "MYDATA\r";
    final String src1 = "MYDATA1\r";
    serialPort.writeBytes(src.getBytes());
    **// Pause here and wait for the reply**
    serialPort.writeBytes(src1.getBytes());
   **//  Pause here and wait for reply**
}




private class ReadThread extends Thread {
    byte[] buf = new byte[512];

    @Override
    public void run() {
        super.run();
        while (!isInterrupted()) {
            int size;
            if (mInputStream == null)
                return;
            size = serialPort.readBytes(buf);

            if (size > 0) {

                byte[] dest = new byte[size];
                System.arraycopy(buf, 0, dest, 0, size);
                byteLinkedList.offer(dest);
                onDataReceived();

            }
        }
    }
}

现在

2 个答案:

答案 0 :(得分:0)

如果您没有复杂的情况,可以使用Android AsyncTask - 进行搜索,您会发现很多引用。

基本上,您需要一个可以调用的接口,以便在收到数据时进行响应。轮询是在此线程上调用wait的问题。如果您不熟悉等待,您也可以轻松搜索它。

关键问题是UI不应该wait,而且不应该使用线程或AsyncTask。

如果您决定使用线程,那么请考虑创建一个简单的“监听器”(又名interface)。它可能看起来很吓人,但基本上它是一个空类,你需要传递到你的自定义线程。

此外,您可能需要考虑在此过程中您的活动是否仍然可见。如果可能不是,并且您仍需要在后台完成任务,则需要Service

这是您选择的一个很好的“概述”:http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html

由于您确实没有定义完整的用例,您可能需要做更多的研究或更具体。但这应该让你朝着正确的方向前进。

答案 1 :(得分:0)

这不是答案,我无法评论,因为我没有足够的代表。

我同意momo。所以你会有这样的事情:

class SendThread extends Thread{

    boolean gotData = false; //flag to check if data is received.

    @Override
    public void run(){
        while(gotData == false){
            new Runnable() {
                @Override
                public void run(){
                    //SendData code
                    //if you get Data change gotData = true;
                }
            }.run();
            Thread.sleep(3000); //sleep for 3 secs
        }
    }
}