2015-05-02 2 views
0

Обычно я пишу большую часть своего кода, не беспокоясь о потоковом и т. Д., И заставляю его работать и отлаживаться, прежде чем пытаться выгружать фрагменты в другие потоки. Для меня самый простой способ сделать это - разбить функцию на Runnable или два. Оттуда я могу начать кусок через новую Thread (runnable) .start() и другие части, которые я запускаю в основном потоке через handler.post().Каков наилучший способ передачи данных в Runnable?

Проблема в том, что я не могу передавать аргументы. Иногда я могу обойти это, но слишком часто я в конечном итоге использую нелокальные переменные, что делает вещи реальными беспорядками. Любые идеи о «правильном» способе передачи аргументов в runnable?

+0

Конструктор? Метод сеттера? 'Final'? Трудно ответить абстрактно. – CommonsWare

+0

http://techtej.blogspot.com/2011/02/android-passing-data-between-main.html –

ответ

1

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

Если мне нужен результат обратно из расчета, я вместо этого реализую Callable.

Я также использую непосредственно исполнителей, а не потоки.

+0

Есть ли способ сделать это, не создавая новый класс? –

+0

@EvanLanglois: вы можете не понимать, как работают Runnables, поскольку вам всегда нужно создавать для этого конкретный класс, независимо от того, является ли он анонимным классом или объявленным классом. Runnable - это интерфейс и не может быть создан, если вы не создадите конкретный класс, который его реализует. 1+ –

+0

@EvanLanglois Вы можете использовать лямбда-выражения Java 8 для реализации runnables с минимальными накладными расходами, имея при этом доступ к локальным переменным и параметрам метода. – isnot2bad

0

Определенно публичная синхронизированная очередь.

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

Это гарантирует, что данные попадут в ваш поток из внешнего потока, такого как основной поток программы, без прерывания потока программы.

Очередь может обрабатываться путем добавления значения, когда данные должны быть переданы, и метод get last element можно вызвать, чтобы получить последний элемент даты, переданный в поток.

+0

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

+0

True ... Но это сэкономит вам время в долгосрочной перспективе, плюс тот факт, что вы можете повторно использовать его, а также тот факт, что вы можете просто добавить переменную в конец очереди. Я делал это раньше, это славно;) – DripDrop

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