Как поддерживать сокет сервера через действия? - PullRequest
1 голос
/ 05 января 2012

В своем приложении я решил сделать сервер и клиент через Sockets (пока просто проверяю мою идею).

Итак, я сделал два AsyncTasks (для сервера и клиента) на моем onCreate (в зависимости от действий пользователя - как я уже говорил, я просто тестирую, а пока только с помощью кнопок):

new createServer().execute(); 

или

new connectClient().execute();

Вопрос в том, что все работает хорошо, но приложение, в котором я хочу реализовать свою идею, имеет много действий, поэтому приложение, которое обслуживает данные, когдаоставив действие там, где находится асинхронная задача createServer, клиент (очевидно) теряет соединение.

Есть ли способ сохранить сервер работающим "все время" и разрешить пользователю (с помощью "приложения сервера")) перемещаться по приложению, не затрагивая подключенных клиентов?Потому что даже если каждый раз, когда я покидаю действие, я создаю Сервер, клиенты все равно теряют соединение.

Очень ценю любое предложение.

РЕДАКТИРОВАТЬ: для целей моего тестового приложения мне нужноСистема будет работать только на переднем плане, без фона, поэтому не нужно создавать сервисы.

1 Ответ

4 голосов
/ 05 января 2012

Ваша проблема в правильном управлении временем жизни вашего сервера. Сначала вы должны решить, какой жизнью вы хотите быть. Очевидно, вы поняли, что хотите, чтобы он был шире, чем просто уровень активности, но хотите ли вы, чтобы он работал в фоновом режиме или только тогда, когда ваше приложение находится на переднем плане? Если это только на переднем плане, вы можете избежать создания службы, а сохранить ссылку на компонент из объекта приложения. Однако, если вы хотите, чтобы ваш сервер работал, даже если ваше приложение работает в фоновом режиме, вам нужна Служба.

Обновление:

Вот пример того, что я имел в виду под «сохранением ссылки на компонент из объекта приложения»:

  • Создание пользовательского класса приложения.
  • Добавить поле для хранения ссылки на ваш сервер AsyncTask

    private AsyncTask mServerTask;
    
  • Добавьте метод для запуска вашего сервера AsyncTask

     public void startServer() {
         mServerTask = new createServer();
         mServerTask.execute();
     }
    
  • Возможно, добавьте другой метод, чтобы остановить ваш сервер

Чтобы запустить свой сервер из действия, теперь вы можете сделать что-то вроде:

CustomApplication app = (CustomApplication) getApplication();
app.startServer();

Конечно, вы захотите сделать больше для правильного управления сервером, например, убедиться, что вы не запускаете его дважды, и т. Д., И вы можете решить использовать потоки вместо AsyncTasks, но это должно дать вам представление о том, как вы может иметь объект с продолжительностью жизни, не соответствующей активности.

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