У меня есть LinkedBlockingQueue
в Медиаторе в моей модели «Производитель-Медиатор-Потребитель».Продюсер сначала обновляет Медиатор, добавляя его в активностьQueue.Затем потребитель / активность ожидает / прослушивает очередь и получает следующий элемент.
Я хочу, чтобы операция увидела, что размер очереди изменился, и захватит следующий элемент. Посредник не видит действия Посредник может видеть только действие.Итак, как мне создать этот механизм слушателя, который я хочу?
Вот мой класс-посредник, который содержит очередь, и действие каким-то образом будет смотреть на очередь и получать информацию, если ему нужно обновить.Данные, поступающие в очередь, могут быть случайными и случайными, поэтому механизм опроса не будет работать.
public class MediatorData {
/** Queue for the Activity */
LinkedBlockingQueue <byte[]> queueConsumer = new LinkedBlockingQueue <byte[]>();
/**
* Add data to a queue(s) for consumption
*/
public void put(byte[] data) throws InterruptedException {
queueConsumer.add(data);
}
/**
* Return data from the queue for the Feature calculations
*/
public byte[] getFeatureData() throws InterruptedException {
return queueConsumer.poll(100, TimeUnit.MILLISECONDS);
}
}
Пример моего класса активности, его класса отображения, поэтому слушатель очереди должен быть эффективным и быстрым.
public class DisplayGraph extends Activity {
// populated from Application Class where its created
pirvate MediatorData md;
public void onCreate(Bundle savedInstanceState) {
md = getMediator(); // This comes from the custom Application class
... some type of listener to queue
}
private void getQueueData() {
byte[] tv = md.queueConsumer.poll();
// can't update textview get exception CalledFromWrongThreadException
((TextView) DisplayGraph.this.findViewById(R.id.tv)).setText("TV " + tv[0]);
}
}