我在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会停止显示任何错误的线程?
感谢您的任何想法!
答案 0 :(得分:1)
对我而言,您似乎在add(E o)
中遇到异常,由于某种原因您在logcat中看不到。
如果查看http://docs.oracle.com/javase/1.4.2/docs/api/java/util/ArrayList.html#set(int,java.lang.Object中的文档,方法set()是错误的
使用指定的元素替换此列表中指定位置的元素。
抛出: IndexOutOfBoundsException - 如果索引超出范围(索引&lt; 0 || index&gt; = size())。
所以使用set你应该得到一个IndexOutOfBoundsException,因为你还没有任何元素,index == 0,size == 0和index&gt; = size == true
但是add(int index,Object element)应该可行,并且你说你得到同样的问题......
在你的add方法的代码中放一个日志或断点,看看它退出的是哪一行。