0

キューの実装があります。デキューを実行するには、poll() API を使用してヘッドを削除しますが、NoSuchElementException をスローしてはなりません。なぜこれが起こるのか誰にも説明できますか?キューにデキューするのに十分なデータがあります。

protected boolean enQueue(ByteBuffer data){
    if (queue.offer(data)){
        return true;
    }else {
        return false;
    }   
}

protected ByteBuffer deQueue(){
    ByteBuffer data = null;
    try{
        if(getQueueCount() > 0)
        {
            data = queue.poll();
            if(data != null){
                return data;
            }else {
                return null;
            }
        }
        else{
            return null;
        }
    }
    catch(NoSuchElementException e){
        e.printStackTrace();
        return null;
    }
}

編集:

java.util.Queue<ByteBuffer> queue;

public Queue(){
    queue = new LinkedList<ByteBuffer>();
}
protected int getQueueCount(){
    return queue.size();
}

スタックトレース:

03-04 14:58:50.205: W/System.err(7937): java.util.NoSuchElementException 03-04 14:58:50.205: W/System.err(7937): java.util.LinkedList.removeFirstImpl ( LinkedList.java:689) 03-04 14:58:50.205: W/System.err(7937): java.util.LinkedList.removeFirst(LinkedList.java:676) 03-04 14:58:50.205: W/ System.err(7937): java.util.LinkedList.poll(LinkedList.java:895) 03-04 14:58:50.205: W/System.err(7937): com.android.testapp.Queue.deQueue で(Queue.java:37) 03-04 14:58:50.205: W/System.err(7937): com.android.testapp.DisplayData.run (LogViewActivity.java:1164) で

編集2:

エンキュー

Queue.getInstance().enQueue(tempByteBufRead);

これは、Bluetooth を介して受信したデータを bluetooth.class のキューに入れるために使用します。tempByteBufRead は Bytebuffer です。そして、これは別のスレッドで行われます。

デキュー

while( Queue.getInstance().getQueueCount() <= 0);


        try {
            if(LLTestAppActivity.DEBUG){
                Log.d("DisplayData", "Crossed queue count...");
            }
            ByteBuffer tempByteBuf = Queue.getInstance().deQueue(); 
            if(null == tempByteBuf){
                Log.d("DisplayData", "No data in queue...");
            }
            else{
                   //TODO:
                 }
            }catch(){}

これが私がデキューする方法です。これは別のクラスファイルにあります。これは、テキスト ビューにデータを表示するために使用される別のスレッドです。

4

2 に答える 2

2

キューが空です (というか、最初の要素がありません)。LinkedList の poll メソッドは次のように実装されています。

public E poll() {
    if (size==0)
        return null;
    return removeFirst();
}

removeFirst は NoSuchElementException をスローするメソッドです。

どうやらキューがゼロ以外の要素数を報告しているため、最初の要素が失われる原因を突き止めてください。どのようにオブジェクトをキューにプッシュしますか?

EDIT:編集を見た後のコードへの提案された変更:

// use a thread-safe queue implementation:
java.util.concurrent.BlockingQueue<ByteBuffer> queue;

// make the constructor private, since it's a singleton you don't want anyone else to be able to instantiate
private Queue() {
    queue = new LinkedBlockingQueue<ByteBuffer>();
}

// enQueue and deQueue without a bunch of redundant code:
protected boolean enQueue(ByteBuffer data) {
    return queue.offer(data);
}

protected ByteBuffer deQueue() {
    return queue.take();
}

// enqueue data like this:
Queue.getInstance().enQueue(tempByteBufRead);

// and dequeue it:
try {
    ByteBuffer tempButeBuf = Queue.getInstance().deQueue();
    // TODO: do something useful with the buffer
} catch (InterruptedException e) {
}
于 2014-03-04T10:01:25.107 に答える
0

ピーク:

このキューの先頭を取得しますが、削除はしません。このキューが空の場合は null を返します。戻り値: このキューの先頭、またはこのキューが空の場合は null

投票:

このキューの先頭を取得して削除するか、このキューが空の場合は null を返します。戻り値: このキューの先頭、またはこのキューが空の場合は null

したがって、peek メソッドを使用できます。また、質問の問題は、キューが空であるため、データを正しくキューに入れるようにしてください

于 2014-03-04T09:18:23.250 に答える