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() 并没有解决问题,但这只是一个需要解决的细节。暂时不应该打扰你。

每 100 毫秒 (atFixedRate) 在 ScheduledFuture(计时器)中调用 storeData() 方法。只要计时器由于 IF 而不会调用 storeData() ,一切都会按预期工作。但是一旦第一次调用 storeData() ......

...程序在 waitCRM.add(crmValue) 期间离开方法 storeData();

...定时器被取消(其他线程恢复工作)

...并且在控制台或 LogCat 中没有发现异常或其他任何内容

鉴于没有错误消息,我花了几个小时才发现这么多。所以这是我的问题:Java/Android 如何以及在什么情况下停止线程而不显示任何错误?

感谢您的任何想法!

4

1 回答 1

1

对我来说,您似乎遇到了异常add(E o),由于某种原因,您在 logcat 中看不到。

方法 set() 是错误的,如果您查看http://docs.oracle.com/javase/1.4.2/docs/api/java/util/ArrayList.html#set(int , java.lang 。目的)

将此列表中指定位置的元素替换为指定元素。

抛出:IndexOutOfBoundsException - 如果索引超出范围(索引 < 0 || 索引 >= size())。

所以使用 set 你应该得到一个 IndexOutOfBoundsException 因为你还没有任何元素, index == 0, size == 0 和 index >= size == true

但是 add(int index, Object element) 应该可以工作,你说你遇到了同样的问题......

在 add 方法的代码中放置一个日志或断点,然后查看它在哪一行退出。

于 2012-06-24T12:41:52.773 回答