Лучший способ обновить активность из очереди - PullRequest
3 голосов
/ 14 февраля 2012

У меня есть 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]);
    }
}

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Лучший способ справиться с этой ситуацией заключается в следующем: в предыдущем ответе есть ошибки.

public class MediatorData extends Observable {

    /** 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);
        notifyObservers();
    }

    /**
     * Return data from the queue for the Feature calculations
     */
    public byte[] getFeatureData() throws InterruptedException {
        return queueConsumer.poll(100, TimeUnit.MILLISECONDS);
    }
}

Для отображения требуется запустить обновление в потоке пользовательского интерфейса, поэтому используйте метод runOnUiThread.

public class DisplayGraph extends Activity implements Observer {

    // populated from Application Class where its created
    private MediatorData md;

    byte[] tv;

    public void onCreate(Bundle savedInstanceState) {
        md = getMediator();  // This comes from the custom Application class
        md.addObserver(this);
    }

    private void getQueueData() {
        tv = md.queueConsumer.poll();
        runOnUiThread(setRunnable);
    }

    public void update(Observable arg0, Object arg1) {
        getQueueData();
    }

    // Need to do this to update the data to the UI.
    final Runnable setImageRunnable = new Runnable() {
        public void run() {
            ((TextView) DisplayGraph.this.findViewById(R.id.tv)).setText("TV " + tv[0]);
        }
    };
}
1 голос
/ 14 февраля 2012

Как насчет использования Observer и Observable ?

Может быть что-то вроде этого:

public class MediatorData extends Observable {

    /** 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);
        setChanged();
        notifyObservers();
    }

    /**
     * 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 implements Observer {

    // populated from Application Class where its created
    private MediatorData md;

    public void onCreate(Bundle savedInstanceState) {
        md = getMediator();  // This comes from the custom Application class
        md.addObserver(this);
    }

    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]);
    }

    public void update(Observable arg0, Object arg1) {
        getQueueData();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...