Android : сообщения между потоками
Во втором потоке запускается таймер, который должен ожидать отклика на кнопку из UIВот это поясни плз. Я не понял, что у тебя должно происходить.
У меня есть в первом потоке (пользовательском интерфейсе UI) есть кнопка, текстовое поле которое отображает таймер. Во втором потоке обрабатывается ход работы таймера. Мне нужно при нажатии на кнопку(из первого потока) остановить таймер (во втором потоке). Как происходят передача сообщений между первым и вторым потоком?
* CountdownLatch
* BlockingQueue
* просто volatile переменную со стейтом, куда второй поток заглядывает
* ...
Что там у тебя за "таймер" во втором потоке непонятно, поэтому подсказать, что лучше выбрать, я не могу.
* просто volatile переменную со стейтом, куда второй поток заглядываетЭ-э-э-э...
Стейт - примитив или любой иммьютэбл объект. В этом случае никаких "э".
А нельзя обычный атомик?
Атомик-что-то внутри имеет как раз соответствующее волатайл поле. Единственное, что Атомик* добавляет к обычному волатайлу - это атомарный cas, реализованный через sun Unsafe.
Иногда cas не нужен, и тогда разумно использовать волатайл.
Например, если ты знаешь, что в этот инт будет писать только один поток, то на атомарность чтения+записи тебе плевать, и можно юзать просто волатайл. Это экономит тебе чутка памяти на доп объектах и цпу на записи.
У меня есть в первом потоке (пользовательском интерфейсе UI) есть кнопка, текстовое поле которое отображает таймер. Во втором потоке обрабатывается ход работы таймера. Мне нужно при нажатии на кнопку(из первого потока) остановить таймер (во втором потоке). Как происходят передача сообщений между первым и вторым потоком?Вообще рабочие потоки и GUI поток всегда синхронизируются через очередь сообщений GUI потока, так что это вполне легко отгуглить, например, через слова "send GUI message from another thread". Например, я так сразу же отгуглил вот такой метод: Activity.runOnUiThread; или более подходящий в некоторых случаях подход: Handler.post; ещё есть вот такой готовый механизм: AsyncTask
Последнее как раз должно тебе подойти, потому что там есть готовые методы для отмены задания, так что наделаешь меньше ошибок.
У меня есть в первом потоке (пользовательском интерфейсе UI) есть кнопка, текстовое поле которое отображает таймер. Во втором потоке обрабатывается ход работы таймера. Мне нужно при нажатии на кнопку(из первого потока) остановить таймер (во втором потоке). Как происходят передача сообщений между первым и вторым потоком?С этого и надо было начинать. На оффсайте есть готовый пример ровно для этого:
http://android-developers.blogspot.ru/2007/11/stitch-in-time...
Атомик-что-то внутри имеет как раз соответствующее волатайл поле.Ч0-ч0-ч0-ч0?
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;
}
...
}
Ч0-ч0-ч0-ч0?В JVM давно поменяли смысл volatile конструкций, чтобы не вводить людей в заблуждение.
Как ни странно, в .NET эту практику не переняли, зато вся запись в переменные там volatile.
В JVM давно поменяли смысл volatile конструкций, чтобы не вводить людей в заблуждение.Блин.
Как ни странно, в .NET эту практику не переняли, зато вся запись в переменные там volatile.Ну нет же в мелкософте изобрели, правда?
Оставить комментарий
petrus63
У меня есть 2 потока(один поток отвечает за интерфейс пользователя, другой поток отвечает за выполняет основную логику программы) . Во втором потоке запускается таймер, который должен ожидать отклика на кнопку из UI. Как это лучше реализовать?Я думал отправлять сообщения из второго потока в первый и при нажатии на кнопку отправлять сообщение обратно, либо второй способ выполнять все во втором потоке, правда не знаю как обращаться к UI из него.Помогите, please