这是一个非常奇怪的问题,我不能为我的生活弄清楚什么是错的。
我有两个字符串数组,在类的顶部声明:
String[] artistsURLIndexArray;
String[] artistsOnlyArray;
它们都在一个在onCreate方法中运行的单独线程(后台工作程序)中更新。我在调试中看到一切正常,数组已正确更新。
在后台线程之后,我有以下代码(仍在onCreate方法中):
String[] test;
if(artistsOnlyArray == null) // point A
{
test = new String[] { "empty...", "asd" }; // point B
}
else
{
test = new String[] { "not empty!", "asd" }; // point C
}
现在,当我'运行'应用程序(没有调试)时,test[0]
是“空的......”。也就是说,artistsOnlyArray
为空!情况并非如此。 (顺便说一下,我用listview直观地测试test
数组。)
如果我继续在B点放置断点并调试应用程序,应用程序会停止(中断)。当然,这是预期的,因为它声称artistsOnlyArray
为空。
如果我在C点放置一个断点,则不会到达断点。也'好'。
但是,如果我在A点放置一个断点,那么一切都会改变。当然会到达断点,现在必须检查数组是否为空。我按F8继续(我正在使用Eclipse),突然,test[0]
“不为空!”。我还可以看到artistsOnlyArray
是正确的(非空)。
为什么断点的外观(和位置)会导致此行为?
答案 0 :(得分:1)
我只能假设这是因为在A点放置断点时工作线程的“额外时间”。
当你没有放置任何断点时,if
语句的执行在之前发生任何工作线程填充数组,因此它进入if
。
另一方面,当您在A点放置断点时,您可以为工作线程填充数组。因此,当您继续时,阵列已经填充并进入else
。
答案 1 :(得分:0)
你自己回答:“它们都在一个单独的线程中更新”。
断点可能导致“竞争”条件,其中线程的相对时间受到干扰。具体而言,在断点发生之前,可能会阻止或不阻止更新线程。