android应用程序通过套接字发送小cmds

时间:2011-10-14 22:03:36

标签: android multithreading sockets

我有一个带有很多按钮的android应用程序。如果按下按钮,它会通过套接字向服务器发送短cmd。

目前,按下按钮时,会将cmd添加到列表中。 我有一个工作线程,不断检查列表中的cmds,如果找到一个打开一个套接字并发送cmd。

由于工作线程不断运行,因此效率不高。改善这种情况的最佳方法是什么?

public class Arduino implements Runnable{

private static PrintWriter arduinoOutput;
private static Socket ss;
private static Queue<String> cmdsToSend=new LinkedList<String>();
private static String cmd;

public void run(){
    while(true){
        if(!cmdsToSend.isEmpty()){
            cmd = cmdsToSend.poll();
            System.out.println("send:"+cmd);
            if(connect()){
                arduinoOutput.println(cmd);
                disconnect();
            }
        }
    }
}

public static void sendCmd(String newcmd){
    cmdsToSend.add(newcmd);
}

private static boolean connect(){
    try {
        ss = new Socket();
        InetAddress addr = InetAddress.getByName("192.168.1.8");
        int port = 23;
        SocketAddress sockaddr = new InetSocketAddress(addr, port);
        ss.connect(sockaddr, 2000);
        arduinoOutput = new PrintWriter(ss.getOutputStream(),true); //Autoflush
        return true;
    } catch (UnknownHostException e) {
        return false;
    } catch (IOException e) {   
        return false;
    }
}

private static void disconnect(){
    arduinoOutput.close();
    try {
        ss.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

UI活动通过调用Arduino.sendCmd(“cmdName”)添加cmd; cmds需要尽快发送,因此循环中的睡眠是不好的。 任何想法或例子都将不胜感激。

1 个答案:

答案 0 :(得分:0)

使用等待/通知模式。将发件人放在包含列表的线程上。只要有写入工作线程的内容,让编写器添加命令,然后通知线程。如果线程已经唤醒,则通知将不执行任何操作。

这是一个简单的例子,显然你将用来启动写作线程的机制会有所不同。

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.ThreadFactory;

public class Notifier
{
    public static void main( String args[] )
    {
        Writer writingThread = new Writer();
        writingThread.addToQueue( "Command 0" );
        ThreadFactory.submitInSingleThread( writingThread );

        for (int i = 1; i < 1000; i++)
        {
            writingThread.addToQueue( "Command " + i );
            writingThread.notify();
        }
    }

    static class Writer implements Runnable
    {
        private static Queue<String> cmdsToSend = new LinkedList<String>();

        public void addToQueue( String cmd )
        {
            cmdsToSend.add( cmd );
        }

        @Override
        public void run()
        {
            while( true )
            {
                if( !cmdsToSend.isEmpty() )
                {
                    String cmd = cmdsToSend.poll();
                    System.out.println( "send:" + cmd );
                    if( connect() )
                    {
                        arduinoOutput.println( cmd );
                        disconnect();
                    }
                }

                synchronized( this )
                {
                    wait(); //Can add a timer (100ms, for example)
                }
            }
        }
    }
}