как это должно быть сделано? (Андроид) - PullRequest
1 голос
/ 31 марта 2011

Меня смущает, как я могу чего-то достичь и как это должно быть сделано, так как считаю, что существует более одного метода;

У меня есть приложение, и в начале оно устанавливает TCP-соединение с сервером, а затем время от времени позволяет вам делать вид, что вы нажимаете кнопку и отправляете строку на сервер. На самом деле соединение (я использовал java.net.Socket) должно запускаться в отдельном потоке из основного потока пользовательского интерфейса (где он сейчас находится).

У меня есть публичный метод, поэтому, когда кнопка нажата, метод вызывается, и данные отправляются, но опять-таки это запускается из основного потока пользовательского интерфейса. Поскольку соединение является постоянным на протяжении всего жизненного цикла приложения, оно, вероятно, должно быть сервисом с намерениями, но можете ли вы использовать метод call'able в сервисе с намерениями для отправки данных на заднем уровне через соединение с задним заземлением?

Или служба, которая соединяет сокет в методе onStart (), а затем внутри службы реализует асинхронную задачу? Я потерян!

Ответы [ 2 ]

1 голос
/ 31 марта 2011

Вы можете использовать synchronized, например, для выполнения этого (и это, конечно, просто царапина, без обработки какого-либо исключения):

public class SyncedTcpClient extends Thread{
    synchronized boolean new_data_available = false;
    String _data = null;
    public void run()
    {
        Socket s = new Socket("127.0.0.1", 3000);

        while(1)
        {
           synchronized(this)
            {
                if(new_data_available)
                {
                   // send data
                       new_data_available = false;
                }
                else
                {
                   wait();
                }
            }
        }
    }
    public void setData(String data)
    {
        _date = data;
        new_data_available = true;
    }
}

И в своей деятельности (MyActivity.java) вы добавляете:

OnClickListener myListener = new OnClickListener(){
    public void onClick(View v) {
        tcpThread.setData(data_to_send);
        tcpThread.notify();
    }
};

после того, как соединение установлено, клиент проверит, доступны ли новые данные для отправки, и, если нет, дождется уведомления. Кроме того, вы можете найти этот вопрос полезным

EDIT: Поскольку комментариев слишком много, я отредактировал свой ответ.

Вы должны откуда-то запустить поток tcpClient, верно? Так что делай это из своей деятельности. Таким образом, у вас будет объект потока (как мы его использовали в myListener). относительно notify() - это бессмысленно, когда мы не говорим о потоках (если я ошибаюсь, пожалуйста, кто-нибудь исправит меня), и его цель состоит в том, чтобы "освободить" ожидающие потоки из-за того, что один и тот же объект продолжает выполняться, в данном случае это сам клиентский поток (synchronized(this)), поэтому мы просим его продолжить, и непосредственно перед этим мы изменяем условие в цикле на истинное (в методе setData(String)), чтобы он теперь отправлял данные и снова перейдите в режим ожидания.

0 голосов
/ 31 марта 2011

Вы можете использовать AsyncTask . Внутри функции doInBackground вы отправляете свои данные, получаете ответ и т. Д. Это освобождает поток пользовательского интерфейса. В onPostExecute вы можете обновить поток пользовательского интерфейса с результатами фоновой задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...