0

現在、Android 仮想マシン (エミュレーター、Android 2.1) での開発中に問題が発生しています。問題を解決することではなく、理解することです。私が持っているのはこの方法です:

private void storeData(int crmValue, int crmTouch, int heartrate) {
    // Store in data or ring buffer
    waitCRM.add(crmValue);
    waitTouch.add(crmTouch);
    waitHeart.add(heartrate);
}

wait*** は、ユーザー定義クラス RingBuffer のインスタンス変数です。このクラスの add メソッドは次のようになります。

public void add(E o) {
    buffer.set(index, o);
    index++;
    if (index == capacity) {
        index = 0;
    }
    if (length < capacity) {
        length++;
    }
}

この場合の E は Integer、バッファは ArrayList、容量は 60、インデックスは 0 です。これは、これが最初の add() 呼び出しであるためです。

もちろん、この時点では ArrayList/buffer は空であり、buffer.set() は正しくない可能性があります。これは現在の値を返すためです。実際には buffer.add() は問題を解決しませんが、それは解決すべき詳細にすぎません。今のところ気にする必要はありません。

storeData() メソッドは、ScheduledFuture (タイマー) で 100 ミリ秒 (atFixedRate) ごとに呼び出されます。タイマーが IF のために storeData() を呼び出さない限り、すべてが期待どおりに機能します。しかし、 storeData() が初めて呼び出されるとすぐに...

... プログラムは、waitCRM.add(crmValue) の間にメソッド storeData() を終了します。

... タイマーがキャンセルされます (他のスレッドが動作を再開します)

...コンソールまたはLogCatに例外やその他のものが見つかりません

エラーメッセージがなければ、多くのことを調べるだけで何時間もかかりました。だからここに私の質問があります:どのように、どのような状況で Java/Android はエラーを表示せずにスレッドを停止しますか?

アイデアをありがとう!

4

1 に答える 1

1

私にとっては、で例外が発生しているように見えますがadd(E o)、何らかの理由でlogcatには表示されません。

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/ArrayList.html#set(int、java.lang )のドキュメントを見ると、メソッドset()が間違っています。 。物体)

このリストの指定された位置にある要素を指定された要素に置き換えます。

スロー:IndexOutOfBoundsException-インデックスが範囲外の場合(インデックス<0||インデックス>= size())。

したがって、setを使用すると、まだ要素がないため、IndexOutOfBoundsExceptionが発生するはずです。インデックス== 0、サイズ== 0、インデックス>=サイズ==true

しかし、add(int index、Object element)は機能するはずであり、同じ問題が発生すると言います...

addメソッドのコードにログまたはブレークポイントを設定し、どの行で終了するかを確認します。

于 2012-06-24T12:41:52.773 に答える