2015-03-30 5 views
0

В настоящее время я разрабатываю приложение, которое позволяет пользователям отправлять данные датчиков на OSC receiver через UDP, ничего злонамеренного, пользователь полностью контролирует все.Отправка большого количества данных в фоновом режиме

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

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

Я теперь протестировали следующие подходы, но каждый из них имеет свои минусы и/или аварии на разных версиях Android:

  1. Используйте AsyncTask<String, Void, Boolean> и отправить данные в doInBackground(String... strings). Недостатком этого подхода является возможный java.util.concurrent.RejectedExecutionException в Android 2.3.3, потому что это может создать слишком много потоков.
  2. Использовать IntentService и отправить данные onHandleIntent(Intent intent). Недостатком этого подхода является медленный и безответственный интерфейс в Android 2.3.3.
  3. Используйте связанный Service и отправьте данные об открытой функции услуги. Это работает как шарм на Android 2.3.3, но падает на Android 4.4.4 с android.os.NetworkOnMainThreadException.

Какие еще возможности? Будет ли работать AsyncTask<> в связанном Service не запускаться ни в одно из двух исключений?

ответ

1

Почему бы не использовать нить, а не AsyncTask? С кадром события в нем, который ожидает, что данные будут отправлены на него, затем отправляет данные на сервер? В основном это AsyncTask, который никогда не заканчивается и не спит, пока данные не будут отправлены на него. Этот поток может принадлежать Деянию или Службе, в зависимости от того, что имеет смысл для вас.

Как ваше приложение, ваше приложение убьет вашу батарею. Но я подозреваю, что вы это знаете, и все в порядке.

+0

Для этого я использовал пользовательский «HandlerThread» и пользовательский класс «Handler». Одно небольшое наблюдение: «убийство» батареи означает «истощение» в этом контексте, верно? – Residuum

+0

Да. Частота передачи данных с использованием радиочастоты будет истощать много батареи. Так как полная зарядка может занять несколько часов, в зависимости от того, насколько большой аккумулятор имеет свое устройство. Если ваше приложение все равно будет работать, вам может потребоваться пакетная передача данных и отправка их каждые несколько минут. –

+0

Слив в порядке в этом случае, но «убивающие» батареи могут иметь значение для уничтожения батареи. Сбор и отправка данных позже не является вариантом, так как приложение должно использоваться для прямого управления программными синтезаторами. – Residuum

Смежные вопросы