Android : сообщения между потоками

petrus63

У меня есть 2 потока(один поток отвечает за интерфейс пользователя, другой поток отвечает за выполняет основную логику программы) . Во втором потоке запускается таймер, который должен ожидать отклика на кнопку из UI. Как это лучше реализовать?
Я думал отправлять сообщения из второго потока в первый и при нажатии на кнопку отправлять сообщение обратно, либо второй способ выполнять все во втором потоке, правда не знаю как обращаться к UI из него.Помогите, please :)

Dimon89

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

petrus63

У меня есть в первом потоке (пользовательском интерфейсе UI) есть кнопка, текстовое поле которое отображает таймер. Во втором потоке обрабатывается ход работы таймера. Мне нужно при нажатии на кнопку(из первого потока) остановить таймер (во втором потоке). Как происходят передача сообщений между первым и вторым потоком?

katrin2201

Стандартно потоки синхронизируются через:
* CountdownLatch
* BlockingQueue
* просто volatile переменную со стейтом, куда второй поток заглядывает
* ...
Что там у тебя за "таймер" во втором потоке непонятно, поэтому подсказать, что лучше выбрать, я не могу.

apl13

* просто volatile переменную со стейтом, куда второй поток заглядывает
Э-э-э-э...

katrin2201

Стейт - примитив или любой иммьютэбл объект. В этом случае никаких "э".

apl13

Это как-то сильно поморочено.
А нельзя обычный атомик?

katrin2201

Ну что значит заморочено :confused: Малтитрединг - это вообще заморочено.
Атомик-что-то внутри имеет как раз соответствующее волатайл поле. Единственное, что Атомик* добавляет к обычному волатайлу - это атомарный cas, реализованный через sun Unsafe.
Иногда cas не нужен, и тогда разумно использовать волатайл.
Например, если ты знаешь, что в этот инт будет писать только один поток, то на атомарность чтения+записи тебе плевать, и можно юзать просто волатайл. Это экономит тебе чутка памяти на доп объектах и цпу на записи.

kokoc88

У меня есть в первом потоке (пользовательском интерфейсе UI) есть кнопка, текстовое поле которое отображает таймер. Во втором потоке обрабатывается ход работы таймера. Мне нужно при нажатии на кнопку(из первого потока) остановить таймер (во втором потоке). Как происходят передача сообщений между первым и вторым потоком?
Вообще рабочие потоки и GUI поток всегда синхронизируются через очередь сообщений GUI потока, так что это вполне легко отгуглить, например, через слова "send GUI message from another thread". Например, я так сразу же отгуглил вот такой метод: Activity.runOnUiThread; или более подходящий в некоторых случаях подход: Handler.post; ещё есть вот такой готовый механизм: AsyncTask
Последнее как раз должно тебе подойти, потому что там есть готовые методы для отмены задания, так что наделаешь меньше ошибок.

Dimon89

У меня есть в первом потоке (пользовательском интерфейсе UI) есть кнопка, текстовое поле которое отображает таймер. Во втором потоке обрабатывается ход работы таймера. Мне нужно при нажатии на кнопку(из первого потока) остановить таймер (во втором потоке). Как происходят передача сообщений между первым и вторым потоком?
С этого и надо было начинать. На оффсайте есть готовый пример ровно для этого:
http://android-developers.blogspot.ru/2007/11/stitch-in-time...

Dimon89

Или ботай класс ScheduledThreadPoolExecutor.

apl13

Атомик-что-то внутри имеет как раз соответствующее волатайл поле.
Ч0-ч0-ч0-ч0? :ooo:

katrin2201


package java.util.concurrent.atomic;
import sun.misc.Unsafe;

/**

...

* @since 1.5
* @author Doug Lea
*/
public class AtomicInteger extends Number implements java.io.Serializable {

...

private volatile int value;

private static final long valueOffset;
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value";
} catch (Exception ex) { throw new Error(ex); }
}
...

public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

public final void set(int newValue) {
value = newValue;
}

...

}

kokoc88

Ч0-ч0-ч0-ч0?
В JVM давно поменяли смысл volatile конструкций, чтобы не вводить людей в заблуждение.
Как ни странно, в .NET эту практику не переняли, зато вся запись в переменные там volatile. ;)

apl13

В JVM давно поменяли смысл volatile конструкций, чтобы не вводить людей в заблуждение.
Блин. :)
Как ни странно, в .NET эту практику не переняли, зато вся запись в переменные там volatile. ;)
Ну нет же в мелкософте изобрели, правда?
Оставить комментарий
Имя или ник:
Комментарий: