Android-приложение отправляет небольшие cmds через сокет - PullRequest
0 голосов
/ 15 октября 2011

У меня есть приложение для 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();
    }
}

}

Операция пользовательского интерфейса добавляет cmd, вызывая Arduino.sendCmd ("cmdName");Команды должны быть отправлены как можно быстрее, поэтому сон в цикле бесполезен.Любые идеи или примеры будут оценены.

1 Ответ

0 голосов
/ 15 октября 2011

Используйте шаблон ожидания / уведомления. Поместите отправителя в ветку со списком. Всякий раз, когда есть что записать в рабочий поток, попросите автора добавить команду, а затем уведомить поток. Если тема уже проснулась, уведомление ничего не сделает.

Вот краткий пример, очевидно, что механизм, который вы будете использовать для начала записи, будет другим.

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)
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...